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

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依赖并添加令牌关联逻辑:

  1. 在pubspec.yaml中添加依赖(选择与你的firebase_auth@4.1.1兼容的版本,比如firebase_messaging: ^14.1.1)
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:15:53