Auf der WWDC 2019 störte Apple erneut den Frieden der iOS-Entwickler - führte ein neues Benutzerautorisierungssystem ein. Melden Sie sich bei Apple an. Jetzt müssen alle iOS-Anwendungen, die Autorisierungssysteme von Drittanbietern verwenden (Facebook, Twitter usw.), unbedingt die Anmeldung bei Apple implementieren, da sie sonst aus dem AppStore ausgeschlossen werden. Wir haben uns entschlossen, das Schicksal nicht in Versuchung zu führen, und sind losgelaufen, um diese Funktion zu implementieren. Wie genau wir das gemacht haben - finden Sie unter dem Schnitt heraus.
Wir schreiben Autorisierungsservice über Apple
In unserer Arbeit verwenden wir die VIPER + SOA-Architektur, daher haben wir die Autorisierung über Apple als separaten Dienst vorgenommen. Zunächst verpacken wir die Daten in Enumeration, um die Berechtigungsarten (Facebook, VK, Google usw.) bequem zu erweitern:
enum AuthToken { case apple(code: String, name: String) }
Wir werden das Ergebnis mit dem Observable von
RxSwift weitergeben :
protocol AuthProviderProtocol { var authResult: Observable<AuthToken> { get } func login() func logout() }
Protokollimplementierung:
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)) } }
Nuancen zu wissen
- Bei Apple anmelden hat keine Abmeldefunktion im klassischen Sinne des Wortes. Die Bibliothek speichert im Gegensatz zu anderen Eingabebibliotheken keine Daten, sodass die beim Anmelden empfangenen Daten nicht gelöscht werden müssen.
- Bei Apple anmelden erhält den Vor- und Nachnamen des Benutzers beim ersten Login nur einmal. Der Server hat keinen Zugriff auf diese Daten. Bei nachfolgenden Anmeldeversuchen erhalten Sie nur den AuthorizationCode von ASAuthorizationAppleIDCredential . Daher speichern wir auf der Clientseite den Vor- und Nachnamen des Benutzers, bis die Registrierung auf dem Server erfolgreich ist.
- Wenn Sie sich bei Apple anmelden, kann der Benutzer seine E-Mail-Adresse ersetzen. Sie können nur von den Domänen, die Sie in den Einstellungen auf developer.apple.com angegeben haben, in eine gefälschte E-Mail schreiben

- Dieser Artikel beschreibt, wie wir den Back-End-Teil implementiert haben.
Der Artikel erwies sich als klein, aber wir hoffen, dass er für Sie nützlich war.
Vielen Dank für Ihre Aufmerksamkeit!