123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- //
- // KMAppleLoginManager.swift
- // PDF Master
- //
- // 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!
- // }
- //}
|