Flutter使用sign_in_with_apple插件苹果登出及登录获取邮箱为空问题问询
苹果登录返回邮箱为null问题说明与解决
苹果官方的隐私策略限制了用户信息的返回规则,出现邮箱为null属于正常逻辑,原因和解决方案如下:
- 仅当用户第一次给你的应用授权苹果登录时,苹果才会返回
email、fullName这两个敏感字段,后续所有重复授权请求(包括卸载重装APP后再次授权),这两个字段都会返回null,仅会返回用户唯一标识appleCredential.user。 - 若用户授权时选择了「隐藏我的邮箱」,首次返回的邮箱是苹果生成的随机转发邮箱,不会返回用户真实邮箱。
- 修复方案:
- 授权时增加非空判断,只有
appleCredential.email不为空的时候才写入本地存储,避免后续授权的null值覆盖已存储的有效邮箱:
if(appleCredential.email != null){ prefs.setString("email", appleCredential.email!); }- 首次拿到邮箱和姓名时,同步上传到你的业务服务端和
appleCredential.user绑定,后续登录时通过该唯一标识从服务端拉取用户信息即可。 - 开发调试阶段需要反复获取邮箱的话,进入iOS系统【设置】→【Apple ID】→【密码与安全性】→【使用Apple ID的APP】,找到你的测试应用删除授权,再次登录就会重新返回邮箱字段。
- 授权时增加非空判断,只有
Flutter端苹果账号登出实现
苹果没有提供应用内直接调用的账号登出接口,登出分为业务层登出和授权解绑两个场景:
常规业务登出实现
仅需要退出当前应用登录状态的话,按以下步骤实现即可:
Future<void> signOutApple() async { // 1. 调用Firebase登出 await FirebaseAuth.instance.signOut(); // 2. 清空本地存储的用户相关数据 SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.remove("email"); await prefs.remove("mode"); // 可补充删除你存储的其他用户信息 // 3. 跳转回登录页 Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context)=>LoginPage()), (route) => false); }
授权状态校验与解绑(可选)
如果需要校验用户是否已经在系统设置中撤销了应用的苹果授权,可以在应用启动时调用接口校验状态:
// 传入之前存储的苹果用户唯一标识appleCredential.user final credentialState = await SignInWithApple.getCredentialState(userID: savedAppleUserID); if(credentialState == AuthorizationCredentialState.revoked){ // 用户已撤销授权,强制登出跳转登录页 signOutApple(); }
如果要让用户解绑授权,只能引导用户到系统设置的Apple ID管理页手动删除应用授权,应用内无法直接调用接口完成解绑。
内容的提问来源于stack exchange,提问作者asmae briouya
相关产品推荐
相关产品推荐

