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

Flutter iOS集成SignInWithApple无法获取用户信息问题求助

解决Flutter iOS中Sign In with Apple无法获取用户邮箱/全名的问题

核心原因:Apple登录的授权特性

Apple仅在用户首次授权你的应用登录时,才会返回email和fullName字段。如果用户之前已经授权过你的应用,后续调用接口只会返回授权码和身份令牌,不会再返回用户的邮箱和全名信息。

验证方法

在iOS设备的「设置」→「Apple ID」→「密码与安全性」→「使用Apple ID的应用」中找到你的应用,点击「停止使用Apple ID」,然后重新打开应用发起Apple登录,此时应该能获取到邮箱和全名。

其他排查点

  • 确认nonce处理逻辑正确
    确保generateNonce和sha256ofString的实现符合Apple的要求,错误的nonce生成会导致令牌内容异常。参考官方标准实现:

    String generateNonce([int length = 32]) {
      final charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._';
      final random = Random.secure();
      return List.generate(length, (_) => charset[random.nextInt(charset.length)]).join();
    }
    
    String sha256ofString(String input) {
      final bytes = utf8.encode(input);
      final digest = sha256.convert(bytes);
      return digest.toString();
    }
    

    注意:需要导入dart:convert和package:crypto/crypto.dart包。

  • 检查开发者后台配置

    • 确认App ID已启用「Sign In with Apple」服务
    • 确认「Sign In with Apple」的配置中,Primary App ID与你的应用Bundle ID一致
    • 确认团队ID和密钥配置正确(如果使用服务器验证的话)
  • 正确解码身份令牌
    使用JWT解码工具(如jwt_decode包)解析身份令牌,检查payload中是否包含email、given_name、family_name字段:

    import 'package:jwt_decode/jwt_decode.dart';
    
    Map<String, dynamic> payload = Jwt.parseJwt(appleCredential.identityToken!);
    String? email = payload['email'];
    String? givenName = payload['given_name'];
    

内容的提问来源于stack exchange,提问作者Veoxer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:22:11