في WWDC 2019 ، أزعجت Apple مرة أخرى راحة مطوري iOS - عرض نظام ترخيص مستخدم جديد تسجيل الدخول باستخدام Apple. الآن يجب أن تنفذ جميع تطبيقات iOS التي تستخدم أنظمة ترخيص الجهات الخارجية (Facebook و Twitter وغيرها) بالضرورة تسجيل الدخول باستخدام Apple ، وإلا سيتم طردها من AppStore. قررنا عدم إغراء القدر وركضنا لتنفيذ هذه الميزة. كيف بالضبط فعلنا هذا - اكتشف تحت الخفض.
نكتب خدمة الترخيص من خلال Apple
في عملنا ، نستخدم بنية VIPER + SOA ، لذلك قدمنا تفويضًا من خلال Apple كخدمة منفصلة. أولاً ، نلف البيانات في التعداد من أجل توسيع أنواع التراخيص بسهولة (Facebook ، VK ، Google ، إلخ):
enum AuthToken { case apple(code: String, name: String) }
سنقوم بتمرير النتيجة باستخدام أداة
الملاحظة من
RxSwift :
protocol AuthProviderProtocol { var authResult: Observable<AuthToken> { get } func login() func logout() }
تنفيذ البروتوكول:
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)) } }
الفروق الدقيقة في معرفة
- لا يحتوي تسجيل الدخول باستخدام Apple على وظيفة تسجيل خروج بالمعنى التقليدي للكلمة. لا تخزن المكتبة أي بيانات ، على عكس مكتبات الإدخال الأخرى ، لذلك ليست هناك حاجة لمسح البيانات التي يتم تلقيها عن طريق تسجيل الدخول.
- تسجيل الدخول باستخدام Apple يتلقى الأسماء الأولى والأخيرة للمستخدم مرة واحدة فقط عند تسجيل الدخول الأول. لا يملك الخادم حق الوصول إلى هذه البيانات. في محاولات تسجيل الدخول اللاحقة ، سوف تتلقى فقط AuthorizationCode من ASAuthorizationAppleIDCredential . لذلك ، من جانب العميل ، نقوم بتخزين اسم المستخدم ولقبه حتى ينجح التسجيل على الخادم.
- يسمح تسجيل الدخول باستخدام Apple للمستخدم باستبدال بريده الإلكتروني. يمكنك الكتابة إلى بريد إلكتروني مضلل فقط من تلك المجالات التي تحددها في الإعدادات على developer.apple.com

- توضح هذه المقالة كيفية تطبيق الجزء الخلفي.
تبين أن المقالة صغيرة ، لكننا نأمل أن تكون مفيدة لك.
شكرا لاهتمامكم!