Flutter Firebase电话认证遇invalid-app-credential/Token mismatch错误求助
解决Flutter iOS端Firebase电话认证"invalid-app-credential"(Token mismatch)错误
错误原因分析
这个错误是由于iOS上Firebase电话认证依赖APNs推送令牌验证应用身份,当本地生成的APNs令牌与Firebase后台存储的应用凭证不匹配时就会触发。
分步解决方案
1. 核对APNs密钥与Firebase配置的一致性
- 确认Apple开发者后台生成的APNs密钥的Team ID,与Firebase控制台「项目设置→你的iOS应用→App Store ID和Team ID」中的Team ID完全一致
- 确认APNs密钥的Key ID,与Firebase上传该密钥时填写的Key ID完全匹配,且密钥已启用
Apple Push Notifications service权限
2. 检查iOS项目的推送相关配置
打开Xcode(打开项目的ios/Runner.xcworkspace文件),进入Runner target的「Signing & Capabilities」:
- 移除现有
Push Notifications能力后重新添加,确保状态为启用 - 确认
Background modes中已勾选Remote notifications,不要遗漏 - 验证
GoogleService-Info.plist已正确导入,文件中的TEAM_ID、CLIENT_ID、REVERSED_CLIENT_ID与Apple开发者后台、Firebase控制台的信息一致
3. 补充Flutter端的FCM令牌关联代码
Firebase电话认证需要FCM令牌来完成身份校验,需引入firebase_messaging依赖并添加令牌关联逻辑:
- 在
pubspec.yaml中添加依赖(选择与你的firebase_auth@4.1.1兼容的版本,比如firebase_messaging: ^14.1.1) - 在Firebase初始化后添加以下代码:
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_auth/firebase_auth.dart'; Future<void> setupFirebasePhoneAuth() async { await Firebase.initializeApp(); // 获取FCM推送令牌 String? fcmToken = await FirebaseMessaging.instance.getToken(); if (fcmToken != null) { // 测试环境用sandbox,生产环境切换为APNSTokenType.production await FirebaseAuth.instance.setAPNSToken(fcmToken, APNSTokenType.sandbox); } }
4. 重置FlutterFire配置(解决缓存问题)
- 删除
ios/Runner/GoogleService-Info.plist文件 - 运行
flutterfire configure重新配置项目,确保生成最新的配置文件 - 执行
flutter clean→flutter pub get清理缓存,重新编译iOS项目
5. 测试环境注意事项
- iOS模拟器无法接收APNs推送,必须使用真实iOS设备测试电话认证
- 确认Firebase控制台添加的测试号码格式与代码中使用的一致(比如
+447123123456,不要包含空格)
可选:检查AppDelegate.swift配置
如果以上步骤无效,确认iOS原生的AppDelegate.swift已正确初始化Firebase:
import UIKit import Flutter import Firebase @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FirebaseApp.configure() GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
该代码通常由flutterfire configure自动生成,无需手动修改,若之前有改动需恢复此结构。
内容的提问来源于stack exchange,提问作者user1642349
相关产品推荐
相关产品推荐

