// // KMAppleLoginManager.swift // PDF Reader Pro // // Created by lizhe on 2023/8/11. // import Foundation import AuthenticationServices enum KMAppleLoginErrorType: String, CaseIterable { case unknown = "unknown" case failed = "Authorization failed" //"授权失败" case notHandled = "Failed to process authorization request" // "未能处理授权请求" case invalidResponse = "Invalid response to authorization request" // "授权请求响应无效" case requestFailed = "Authorization request failed" //"授权请求失败" case cancel = "Cancel authorization." //"取消授权" } typealias KMAppleLoginCompletion = (_ user: String, _ token: String, _ error: KMAppleLoginErrorType) -> Void class KMAppleLoginManager: NSObject { static let manager = KMAppleLoginManager() private var loginCompletion: KMAppleLoginCompletion? func login(_ completion: @escaping KMAppleLoginCompletion) { self.loginCompletion = completion let provider = ASAuthorizationAppleIDProvider.init() let request = provider.createRequest() let controller = ASAuthorizationController.init(authorizationRequests: [request]) controller.delegate = self // controller.presentationContextProvider = self controller.performRequests() } } extension KMAppleLoginManager: ASAuthorizationControllerDelegate { func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { var errorType: KMAppleLoginErrorType = .unknown switch error._code { case ASAuthorizationError.Code.canceled.rawValue: errorType = .cancel case ASAuthorizationError.Code.failed.rawValue: errorType = .requestFailed case ASAuthorizationError.Code.invalidResponse.rawValue: errorType = .invalidResponse case ASAuthorizationError.Code.notHandled.rawValue: errorType = .notHandled default: errorType = .failed } guard let callBack = self.loginCompletion else { return } callBack("", "", errorType) } func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { if authorization.credential is ASAuthorizationAppleIDCredential { // 登录 let credential = authorization.credential as! ASAuthorizationAppleIDCredential let user = credential.user let fullName = credential.fullName let email = credential.email let state = credential.state let identityToken = credential.identityToken let token = String.init(data: identityToken ?? Data(), encoding: .utf8) debugPrint("apple login success") guard let callBack = self.loginCompletion else { return } guard let resultToken = token else { return } callBack(user, resultToken, .unknown) } else if authorization.credential is ASPasswordCredential { // 使用现有的iCloud密钥链凭证登录。 // let credential = authorization.credential as! ASPasswordCredential // let user = credential.user // let password = credential.password debugPrint("apple login failed") guard let callBack = self.loginCompletion else { return } callBack("", "", .failed) } else { debugPrint("apple login failed") guard let callBack = self.loginCompletion else { return } callBack("", "", .failed) } } } //extension KMAppleLoginManager: ASAuthorizationControllerPresentationContextProviding { // func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { // return self.view.window! // } //}