SignInWithAppleButton无法获取用户凭证,authorizedScopes为空的排查
Sign In with Apple 相关问题解答
1. 从SignInWithAppleButton获取用户凭证的方法
通过SignInWithAppleButton获取用户凭证的核心流程如下:
- 初始化按钮时指定授权场景(如
.signUp用于注册、.signIn用于登录) - 在
request闭包中声明需要获取的权限范围(如.email、.fullName) - 在
onCompletion闭包中解析授权结果:- 当授权成功时,将
authorization.credential转换为ASAuthorizationAppleIDCredential类型 - 从该凭证对象中提取用户唯一ID(
user属性)、邮箱、全名、授权范围等信息
- 当授权成功时,将
示例核心逻辑:
SignInWithAppleButton(.signUp) { request in // 请求邮箱权限 request.requestedScopes = [.email] } onCompletion: { result in switch result { case .success(let authorization): // 转换为Apple ID凭证 guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential else { print("未知凭证类型") return } // 获取用户唯一ID(永久不变) let userID = appleIDCredential.user // 获取授权范围 let authorizedScopes = appleIDCredential.authorizedScopes // 根据授权范围获取邮箱/全名 if authorizedScopes.contains(.email) { let email = appleIDCredential.email print("用户邮箱:\(email ?? "未获取到邮箱")") } case .failure(let error): print("授权失败:\(error.localizedDescription)") } }
2. 授权后authorizedScopes为空的原因及解决办法
你遇到的首次授权后authorizedScopes为空的问题,常见原因及解决方式如下:
原因1:Apple ID授权状态缓存
Apple会缓存同一个Apple ID对App的授权状态,仅首次授权时会返回邮箱和全名,后续即使删除App重装,也不会再次返回这些信息(除非重置授权状态)。
解决方法:
- 前往设备「设置」→「Apple ID」→「密码与安全性」→「使用Apple ID的App」,找到你的App并删除授权,然后重新测试
- 使用未授权过该App的新Apple ID进行测试
原因2:Capabilities配置不完整
确认你的App Target的Capabilities中,「Sign In with Apple」已开启,且所有相关Target(如主App、扩展)都完成了配置。如果仅给主Target开启,但测试时使用了未配置的Target,会导致权限不生效。
原因3:用户在授权弹窗中拒绝共享信息
即使用户代码中请求了.email权限,若用户在授权弹窗中选择「不共享」邮箱,authorizedScopes会为空,且无法获取邮箱信息。这种情况需要引导用户重新授权并同意共享信息。
原因4:按钮类型与场景不匹配
如果你的App已存在其他登录方式,使用.signUp类型的按钮可能不会触发权限请求弹窗(系统判定为非首次注册场景)。可以尝试改用.signIn类型的按钮测试。
参考信息
除Apple官方文档外,Apple开发者论坛中大量开发者反馈过类似的授权缓存问题,核心解决思路均围绕重置授权状态或使用新测试账号展开。
内容的提问来源于stack exchange,提问作者Curious Jorge
相关产品推荐
相关产品推荐

