mha*_*ddl 5 ios13 xcode11 apple-sign-in
我正在使用Apple实施Sign in,并注意到返回的email和fullName属性ASAuthorizationAppleIDCredential仅在此Apple ID的第一个Sign-In上填写。在所有后续登录中,这些属性均为零。
这是iOS 13上的错误还是预期的行为?
这是我用来启动请求的代码:
@available(iOS 13.0, *)
dynamic private func signInWithAppleClicked() {
let request = ASAuthorizationAppleIDProvider().createRequest()
request.requestedScopes = [.fullName, .email]
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.presentationContextProvider = self
controller.performRequests()
}
Run Code Online (Sandbox Code Playgroud)
我正在此委托方法中收到证书:
public func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { return }
let userIdentifier = credential.user
let token = credential.identityToken
let authCode = credential.authorizationCode
let realUserStatus = credential.realUserStatus
let mail = credential.email // nil
let name = credential.fullName // nil
}
Run Code Online (Sandbox Code Playgroud)
Bil*_*lal 54
似乎是一个错误,但在阅读了苹果论坛上的不同帖子后,这似乎是预期的行为。
所以一些外卖。
如果您的服务器出现任何连接错误,请确保将用户详细信息保存在本地(因为您下次不会收到此信息)并继续重试在您的后端创建帐户。
为了在设备上进行测试,您可以撤销您的应用程序的 Apple ID 登录。撤销后它将像下次注册一样工作,您将获得详细信息,例如(电子邮件、姓名等)。
使用 IOS 13 撤销对您设备的访问。
iPhone Settings > Apple Id > Password & Security > Apple ID logins > {YOUR APP} > Stop using Apple ID
Run Code Online (Sandbox Code Playgroud)
小智 7
如果您想知道如何第二次和以后检索电子邮件,这里有一个提示:使用包含在 JWT 用户授权数据(包括电子邮件)中编码的identityToken。
import JWTDecode
// ...
if let identityTokenData = appleIDCredential.identityToken,
let identityTokenString = String(data: identityTokenData, encoding: .utf8) {
print("Identity Token \(identityTokenString)")
do {
let jwt = try decode(jwt: identityTokenString)
let decodedBody = jwt.body as Dictionary<String, Any>
print(decodedBody)
print("Decoded email: "+(decodedBody["email"] as? String ?? "n/a") )
} catch {
print("decoding failed")
}
Run Code Online (Sandbox Code Playgroud)
或者像这样在 PHP 后端解码它:
print_r(json_decode(base64_decode(str_replace('_', '/', str_replace('-','+',explode('.', $identityTokenString)[1])))));
Run Code Online (Sandbox Code Playgroud)
小智 6
这不是错误,但它表明您的身份验证已成功存储到您的设备设置。
如果您想再次获取所有信息,则需要遵循此说明。
转到您的设备 -> 设置 -> Apple ID -> 密码和安全 -> 使用您的 Apple ID 的应用程序 -> 您将获得使用苹果登录时使用的应用程序列表 {查找您的应用程序} -> 在您的应用程序行左侧快速{显示删除选项} -> 单击删除
重新启动您的应用程序或使用苹果按钮抑制登录
现在您可以获取所有信息
这是实现 SignIn with Apple 时的正确行为。
ASAuthorizationAppleIDCredential此行为正确,用户信息仅在初始用户注册时发送 。使用同一帐户使用“Sign In with Apple”后续登录您的应用程序不会共享任何用户信息,只会返回ASAuthorizationAppleIDCredential. 建议您安全地缓存包含用户信息的初始 ASAuthorizationAppleIDCredential,直到您可以验证帐户已在服务器上成功创建。
为了解决这个问题,我们可以将所有必需的信息存储在Keychain. 我已经Singleton为 SignIn With Apple 创建了类。我相信它会对你有所帮助。
Git 来源: https: //github.com/IMHitesh/HSAppleSignIn
您需要按照以下步骤操作:
将 AppleSignIn 文件夹添加到您的项目中。
在 中启用“使用 Apple 登录”
Capabilities。
转到您的
UIViewController“添加容器”视图以使用 Apple 登录。
if #available(iOS 13.0, *) {
appleSignIn.loginWithApple(view:viewAppleButton, completionBlock: { (userInfo, message) in
if let userInfo = userInfo{
print(userInfo.email)
print(userInfo.userid)
print(userInfo.firstName)
print(userInfo.lastName)
print(userInfo.fullName)
}else if let message = message{
print("Error Message: \(message)")
}else{
print("Unexpected error!")
}
})
}else{
viewAppleButton.isHidden = true
}
Run Code Online (Sandbox Code Playgroud)
这似乎是预期的行为:
此行为正确,用户信息仅在初始用户注册时在 ASAuthorizationAppleIDCredential 中发送。使用同一帐户使用 Apple 登录的后续登录应用程序不会共享任何用户信息,只会返回 ASAuthorizationAppleIDCredential 中的用户标识符。建议您安全地缓存包含用户信息的初始 ASAuthorizationAppleIDCredential,直到您可以验证帐户已在服务器上成功创建。
来源https://forums.developer.apple.com/thread/121496#379297
| 归档时间: |
|
| 查看次数: |
472 次 |
| 最近记录: |