准备
- 登入firebase控制台,创建项目。
- 运行命令,添加
firebase_core
和firebase_crashlytics
到pubspec.yaml
:flutter pub add firebase_core
flutter pub add firebase_crashlytics
配置Android
- firebase控制台,创建Android应用
- 下载
google-services.json
,放到android/app
路径下 -
android/build.gradle
:buildscript { repositories { google() mavenCentral() } dependencies { // 添加这一行 classpath 'com.google.gms:google-services:4.4.2' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.8' // Crashlytics 插件 } }
-
android/app/build.gradle
:plugins { id "com.google.gms.google-services" // 添加这一行 id "com.google.firebase.crashlytics"// 添加这一行 }
android { buildTypes { release { //添加这一行 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
配置iOS
- firebase控制台,创建iOS应用
- 下载
GoogleService-Info.plist
,放到ios/Runner
路径下 -
ios/Podfile
如下,运行pod install
安装依赖:platform :ios, '13.0'
- 设置Xcode,以自动上传
调试符号 (dSYM)
文件到firebase控制台:- Xcode -> Runner.xcodeproj -> targets:
-
Building Settings -> All,完成以下步骤,以便 Xcode 为您的 build 生成 dSYM:
- 搜索
debug information format
,对所有build,将Debug Information Format(调试信息格式)
设置为DWARF with dSYM File
- 搜索
-
Build Phases,完成以下步骤,以便 Xcode 可以处理您的 dSYM 并上传文件:
- 点击
+
-> New Run Script Phase(确保这个新运行脚本阶段是项目的最后一个构建阶段;否则 Crashlytics 将无法正确处理 dSYM)
- 点击
-
Run Script
:/bin/sh "${SRCROOT}/Pods/FirebaseCrashlytics/run"
-
Input Files
:${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist
$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist
$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)
-
- Xcode -> Runner.xcodeproj -> targets:
Flutter的代码
- ⚠️下面有两个方法,用来
捕捉异常
上传到firebase控制台,注意他们之间的区别:Future<void> main() async { /// 捕获所有未捕获的 Dart 异常 ///自动捕获在普通 Dart 代码中发生的 同步异常(例如 list 越界 错误), runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); await initFirebase(); runApp(); }, (error, stackTrace) { FirebaseCrashlytics.instance.recordError(error, stackTrace); }); } Future<void> initFirebase() async { await Firebase.initializeApp(); // 将 Flutter 框架捕获的错误上传到 Crashlytics //FlutterError.onError 只会捕获在 Flutter 框架层 发生的错误,例如构建、绘制和布局过程中的异常。 //它不会自动捕获在普通 Dart 代码中发生的 同步异常(例如 list 越界 错误), //这些同步异常通常需要在 runZonedGuarded 或 catchError 中进行处理 FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; }
- 强制崩溃,并在firebase控制台查看崩溃日志:
///主动崩溃 FirebaseCrashlytics.instance.crash(); ///数组越界,崩溃 List<String> list = ['123']; String str = list[1];
⚠️⚠️⚠️报错
-
由于初始化找不到参数配置,出现
Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
:E/flutter (21514): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() E/flutter (21514): #0 MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:195:5) E/flutter (21514): #1 Firebase.app (package:firebase_core/src/firebase.dart:79:41) E/flutter (21514): #2 FirebaseCrashlytics.instance (package:firebase_crashlytics/src/firebase_crashlytics.dart:33:55) E/flutter (21514): #3 main.<anonymous closure> (package:car_music/main.dart:37:25) E/flutter (21514): #4 _RootZone.runBinary (dart:async/zone.dart:1666:54) E/flutter (21514): #5 runZonedGuarded.<anonymous closure> (dart:async/zone.dart:1798:18) E/flutter (21514): #6 _Zone._processUncaughtError (dart:async/zone.dart:1081:14) E/flutter (21514): #7 _CustomZone.handleUncaughtError (dart:async/zone.dart:1285:5) E/flutter (21514): #8 Future._propagateToListeners (dart:async/future_impl.dart:775:16) E/flutter (21514): #9 Future._completeError (dart:async/future_impl.dart:674:5) E/flutter (21514): <asynchronous suspension> E/flutter (21514):
- 解决方法, 把
Firebase.initializeApp();
替换成换个带参数的初始化方法:Firebase.initializeApp( options: const FirebaseOptions( apiKey: '?????', appId: '?????', messagingSenderId: '?????', projectId: '????'));
- 对应的参数在
Android/app/google-services.json
,或者iOS/Runner/GoogleService-Info.plist
可以找到:-
apiKey
<---->current_key
-
appId
<---->mobilesdk_app_id
-
messagingSenderId
<---->project_number
-
projectId
<---->project_id
-
- 对应的参数在
- 解决方法, 把
其他