了解 ASAuthorizationPasswordProvider

Mr.*_*r.P 12 ios swift sign-in-with-apple

使用 Apple 登录及其示例代码,他们有:

let requests = [ASAuthorizationAppleIDProvider().createRequest(),
                ASAuthorizationPasswordProvider().createRequest()]
Run Code Online (Sandbox Code Playgroud)

我对它们之间的区别以及对尝试使用它们的影响感到困惑。

我是否正确地说这ASAuthorizationAppleIDProvider.createRequest()是使用 Apple 登录的请求,并且ASAuthorizationPasswordProvider().createRequest()是使用可能已存储在钥匙串中的用户名和密码的请求?

然后,如果我ASAuthorizationController使用先前的请求创建一个,如下所示:

let authorizationController = ASAuthorizationController(authorizationRequests: requests)
Run Code Online (Sandbox Code Playgroud)

如果一个失败,说他们都失败是否正确?

因此,对于这种情况,如果我的应用程序没有使用钥匙串保存任何先前的凭据,并且我发出这两个请求,第二个请求将失败,因为我没有保存任何内容?我很困惑为什么要使用这两个请求。

Mar*_*049 -1

我做了一些尝试和错误,找到了一些线索。仍然不确定什么时候ASAuthorizationPasswordProvider 真正起作用,但我会分开这两个请求,ASAuthorizationPasswordProvider 首先使用,然后当它失败/成功时,我调用该ASAuthorizationAppleIDProvider 请求。

func perfomExistingAccountSetupFlows() {
    
    let passwordProvider = ASAuthorizationPasswordProvider()
    let passwordRequest = passwordProvider.createRequest()
    
    let authorizationController = ASAuthorizationController.init(authorizationRequests: [passwordRequest])
    
    authorizationController.delegate = self
    
    authorizationController.presentationContextProvider = self
    
    authorizationController.performRequests()
  }
Run Code Online (Sandbox Code Playgroud)

然后在委托中:

func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    
    var errorStr : String?
    print(errorStr ?? "something wrong with apple auth")
    print((error as NSError).code)
    print(ASAuthorizationError.canceled.rawValue,ASAuthorizationError.failed.rawValue,ASAuthorizationError.invalidResponse.rawValue,ASAuthorizationError.notHandled.rawValue,ASAuthorizationError.unknown.rawValue)
    print(error.localizedDescription)
    print((error as NSError).userInfo)
    
    guard let mes = (error as NSError).userInfo["NSLocalizedFailureReason"] else {return}
    print(mes as! String)
    print(mes as! String == "No credentials available for login.")
    if(mes as! String == "No credentials available for login."){
      AppleAuth.shared.init_auth()
    }
    
  }
Run Code Online (Sandbox Code Playgroud)

即使它有效,我仍然会决定回到ASAuthorizationAppleIDProvider简单的原因,因为它比另一个有更好的记录。

  func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    var user:String,
        email:String,
        nickname:String,
        identityToken:String,
        authorizationCode:String;
    
    if authorization.credential.isKind(of: ASPasswordCredential.classForCoder()) {
      
      // Sign in using an existing iCloud Keychain credential.
      let passworCreddential = authorization.credential as! ASPasswordCredential
      
      user = passworCreddential.user
      
      let password = passworCreddential.password
      print("---",passworCreddential.description,password,passworCreddential)
      
      AppleAuth.shared.init_auth()
    }
  }
  

  func init_auth() {
    let appleIDProvider = ASAuthorizationAppleIDProvider()
    let request = appleIDProvider.createRequest()
    request.requestedScopes = [.fullName, .email]
    
    let authorizationController = ASAuthorizationController.init(authorizationRequests: [request])
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self
    authorizationController.performRequests()
  }
Run Code Online (Sandbox Code Playgroud)

它似乎比直接调用效果更好ASAuthorizationAppleIDProvider ,有时会失败......

如果这里出现任何问题,将会更新......