En WWDC 2019, Apple una vez más perturbó la paz de los desarrolladores de iOS: introdujo un nuevo sistema de autorización de usuario Inicie sesión con Apple. Ahora, todas las aplicaciones de iOS que utilizan sistemas de autorización de terceros (Facebook, Twitter, etc.) deben implementar Iniciar sesión con Apple sin falta; de lo contrario, las expulsarán de la AppStore. Decidimos no tentar al destino y corrimos para implementar esta función. Cómo exactamente hicimos esto: descúbrelo debajo del corte.
Escribimos servicio de autorización a través de Apple
En nuestro trabajo, utilizamos la arquitectura VIPER + SOA, por lo que autorizamos a través de Apple como un servicio separado. Primero, envolvemos los datos en enumeración para expandir convenientemente los tipos de autorización (Facebook, VK, Google, etc.):
enum AuthToken { case apple(code: String, name: String) }
Pasaremos el resultado usando el Observable de
RxSwift :
protocol AuthProviderProtocol { var authResult: Observable<AuthToken> { get } func login() func logout() }
Implementación de protocolo:
import AuthenticationServices import Foundation import RxSwift @available(iOS 13.0, *) class AppleAuthService: AuthProviderProtocol { private let authResultSubject = PublishSubject<AuthToken>() var authResult: Observable<AuthToken> { return authResultSubject.asObservable() } func login() { let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() request.requestedScopes = [.fullName, .email] let authorizationController = ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate = self authorizationController.performRequests() } } @available(iOS 13.0, *) extension AppleAuthService: ASAuthorizationControllerDelegate { func authorizationController( controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization ) { guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential, let tokenData = credential.authorizationCode, let token = String(data: tokenData, encoding: .utf8) else { return } let firstName = credential.fullName?.givenName let lastName = credential.fullName?.familyName authResultSubject.onNext(.apple(code: token, name: firstName + lastName)) } }
Matices para saber sobre
- Iniciar sesión con Apple no tiene una función de cierre de sesión en el sentido clásico de la palabra. La biblioteca no almacena ningún dato, a diferencia de otras bibliotecas de entrada, por lo que no es necesario borrar los datos recibidos al iniciar sesión.
- Iniciar sesión con Apple recibe el nombre y apellido del usuario solo una vez en el primer inicio de sesión. El servidor no tiene acceso a estos datos. En los intentos de inicio de sesión posteriores, recibirá solo el código de autorización de ASAuthorizationAppleIDCredential . Por lo tanto, en el lado del cliente, almacenamos el nombre y el apellido del usuario hasta que el registro en el servidor sea exitoso.
- Iniciar sesión con Apple le permite al usuario reemplazar su correo electrónico. Puede escribir en un correo electrónico falsificado solo desde aquellos dominios que especifique en la configuración en developer.apple.com

- Este artículo describe cómo implementamos la parte de fondo.
El artículo resultó ser pequeño, pero esperamos que te haya sido útil.
Gracias por su atencion!