You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用sign_in_with_apple插件苹果登出及登录获取邮箱为空问题问询

苹果登录返回邮箱为null问题说明与解决

苹果官方的隐私策略限制了用户信息的返回规则,出现邮箱为null属于正常逻辑,原因和解决方案如下:

  • 仅当用户第一次给你的应用授权苹果登录时,苹果才会返回email、fullName这两个敏感字段,后续所有重复授权请求(包括卸载重装APP后再次授权),这两个字段都会返回null,仅会返回用户唯一标识appleCredential.user。
  • 若用户授权时选择了「隐藏我的邮箱」,首次返回的邮箱是苹果生成的随机转发邮箱,不会返回用户真实邮箱。
  • 修复方案:
    1. 授权时增加非空判断,只有appleCredential.email不为空的时候才写入本地存储,避免后续授权的null值覆盖已存储的有效邮箱:
    if(appleCredential.email != null){
      prefs.setString("email", appleCredential.email!);
    }
    
    1. 首次拿到邮箱和姓名时,同步上传到你的业务服务端和appleCredential.user绑定,后续登录时通过该唯一标识从服务端拉取用户信息即可。
    2. 开发调试阶段需要反复获取邮箱的话,进入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:48:00