自定义Apple登录按钮异常:SwiftUI中appleIDCredential返回值为空
Apple登录后姓名/邮箱返回nil的问题解决
核心原因与解决办法
1. Apple Sign In的授权规则限制
Apple仅在用户首次使用该Apple ID登录你的应用时,才会返回fullName和email字段。后续无论在同一设备还是其他设备登录,这两个字段都会返回nil——Apple不会重复提供这些隐私数据,你需要在首次拿到后自行存储(比如存到服务器或Keychain中),后续通过userIdentifier来关联用户。
2. 代码中的字段读取错误
你当前的代码里没有正确读取姓名和邮箱字段:
// 错误写法:直接赋值了整个credential对象 let userFullName = appleIDCredential
应该读取fullName和email属性,并且fullName是PersonNameComponents类型,需要拆分出具体的名和姓。
修正后的代码示例
修正授权成功的回调方法
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential { // 获取唯一用户标识(每次登录都能拿到,用于关联用户) let userID = appleIDCredential.user // 仅首次登录能拿到以下字段 let givenName = appleIDCredential.fullName?.givenName ?? "" let familyName = appleIDCredential.fullName?.familyName ?? "" let email = appleIDCredential.email ?? "" print("用户ID: \(userID)") print("姓名: \(givenName) \(familyName)") print("邮箱: \(email)") // 这里要把首次拿到的姓名、邮箱和userID绑定,存储到服务器或本地 if !givenName.isEmpty || !email.isEmpty { // 执行存储逻辑 } } }
额外注意事项
- 测试时,如果需要重新获取姓名和邮箱,需要先在设置 > Apple ID > 密码与安全性 > 使用Apple ID的应用中,找到你的应用并移除授权,然后重新登录。
- 务必用
userIdentifier作为用户的唯一标识,不要依赖姓名或邮箱来区分用户,因为这些信息可能为空或用户后续修改。
内容的提问来源于stack exchange,提问作者Jackson Renson
相关产品推荐
相关产品推荐

