返回

Flutter iOS Firebase 日志故障排查: App Attest 问题

IOS

Flutter iOS Firebase 日志输出故障:App Attest 问题排查

Flutter 应用在 iOS 平台使用 Firebase 时,如果遇到日志无法打印,尤其是在使用 App Attest 功能时,这可能是一个较为棘手的问题。此问题常发生于 App Attest 的调试配置阶段,或是在升级 iOS 系统和相关依赖包之后。下面介绍一些常见的排查方向及对应的解决方法。

问题分析

日志缺失问题通常与以下几个方面有关:

  1. Firebase 初始化问题 : Firebase SDK 可能未能正确初始化,导致日志无法正常输出。
  2. App Attest 配置错误 : App Attest 的调试环境配置不当可能会阻止日志打印。
  3. Xcode Scheme 配置错误 : 缺少必要的启动参数,例如 -FIRDebugEnabled 可能会抑制日志的显示。
  4. 依赖版本冲突或过时 : Firebase 依赖库版本之间存在兼容问题或库本身有已知的问题,也可能影响日志。
  5. iOS 版本更新的影响 : 新的 iOS 版本可能会改变底层机制,导致部分日志被屏蔽。
  6. Info.plist 配置错误 : FirebaseAppDelegateProxyEnabled 设置不正确可能导致日志收集失效。
  7. 环境因素 : 由于本地环境的问题例如证书或文件出现异常导致问题发生。

解决方案

以下针对每个可能原因提出解决方案,并附有对应的操作步骤及代码示例:

1. 检查 Firebase 初始化

确认 Firebase.initializeApp() 方法在应用启动时被正确调用。 如果使用的是异步方法,请确保使用了 await 。确保 AppCheck 初始化也正确调用,在开发环境中需要激活对应的 Debug 提供器。

代码示例:

  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  await FirebaseAppCheck.instance.activate(
        webProvider: ReCaptchaV3Provider('recaptcha-v3-site-key'),
        androidProvider: AndroidProvider.debug,
        appleProvider: AppleProvider.debug,
      );

操作步骤:

  • 确保 Firebase.initializeApp()main() 函数中被正确调用。
  • 确保AppCheck activate 的时候 debug provider 被正确设置。

2. 修正 App Attest 配置

检查 FirebaseAppCheck.instance.activate() 中 App Attest 的 provider 设置,开发环境中应该设置为 AppleProvider.debug, 确保 AppleProvider 未被混淆或与生产环境的 AppleProvider 设置混用。

代码示例:

   await FirebaseAppCheck.instance.activate(
        webProvider: ReCaptchaV3Provider('recaptcha-v3-site-key'),
        androidProvider: AndroidProvider.debug,
        appleProvider: AppleProvider.debug,
      );

操作步骤:

  • 确保 appleProvider 被设置为 AppleProvider.debug , 以允许调试期间日志输出。

3. 核查 Xcode Scheme 设置

在 Xcode 中,检查当前使用的 scheme 配置。 确认 “Arguments Passed On Launch” 是否包含了 -FIRDebugEnabled 标志。此标志使 Firebase 输出详细的日志信息,有利于问题的排查。

操作步骤:

  1. 打开 Xcode 项目,点击 Scheme 编辑器,然后编辑你的 Run scheme。
  2. 在 Run Scheme 设置的 “Arguments” 标签中,检查 “Arguments Passed On Launch” 部分是否有 -FIRDebugEnabled 存在。若没有,请添加它。

4. 依赖版本回滚或升级

如果怀疑是 Firebase 依赖库版本问题,尝试回退或升级到其它稳定版本。建议优先使用与你的Flutter SDK兼容的Firebase版本, 尤其是当你在开发环境中使用Debug Provider。
操作步骤:

  • 修改 pubspec.yaml 中 Firebase 依赖库的版本号,例如指定某个版本:
    dependencies:
      firebase_analytics: "11.3.3"
      firebase_app_check: "0.3.1+3"
      firebase_core: "3.6.0"
      firebase_crashlytics: "4.1.3"
      firebase_performance: "0.10.0+8"
      firebase_messaging: "15.1.3"
      firebase_remote_config: "5.1.3"
    
  • 运行 flutter pub get 来更新依赖。如果使用指定的版本,则需要确认版本可以运行。

附加安全建议:
使用锁文件(pubspec.lock)确保开发团队使用一致的依赖版本,避免版本带来的问题。

5. info.plist 中FirebaseAppDelegateProxyEnabled的设置

确认 info.plist 文件中的 FirebaseAppDelegateProxyEnabled 键值是否设置为 false 。 如果该键存在且值设置为 true,可能会阻止日志输出。设置为 false 能够让 Firebase 在应用启动时接管事件,对于 debug 版本需要设置为 false 以允许debug 信息打印,尤其在 App Attest 环境中。
操作步骤:

  • 找到项目中的ios/Runner/info.plist 文件, 添加或更新 FirebaseAppDelegateProxyEnabled ,并将值设置为 false
 <key>FirebaseAppDelegateProxyEnabled</key>
  <false/>

6. 证书,Provisioning Profile 和bundle ID

检查在开发者账号证书,设备使用的文件 (provisioning profile) ,以及项目 bundle ID 是否正确配置且一致,并且证书和描述文件均具备App Attest的能力,这些证书的更新, 尤其是团队和开发者证书失效会导致问题发生。 如果是多开发者同时工作,务必使用统一的开发证书。

操作步骤:

  • 在Xcode设置中找到 Signing 和 Certificates 配置页面,检查对应的配置信息和有效时间。
  • 确保证书没有过期,描述文件被正确的签名,bundle ID与app Id完全一致。

其他建议

  1. 清理项目缓存: 删除 podlock 文件,Pods 目录, pubspec.lock, 执行 flutter clean 然后再执行 flutter pub getpod install 命令。确保环境干净,重新生成依赖。
  2. 使用真机测试:模拟器和真机的行为有时候会不一样,可以在真机上进行测试来确认问题。

命令示例:

flutter clean
rm ios/Podfile.lock
rm -rf ios/Pods
rm pubspec.lock
flutter pub get
cd ios && pod install

请注意,彻底检查配置需要一些耐心和时间,逐步排除,这样才能准确找到问题并有效解决。