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 ,有时会失败......
如果这里出现任何问题,将会更新......