準備
- 登入firebase控制臺后雷,創(chuàng)建項目波桩。
- 運行命令鹅巍,添加
firebase_core
和firebase_crashlytics
到pubspec.yaml
:flutter pub add firebase_core
flutter pub add firebase_crashlytics
配置Android
- firebase控制臺,創(chuàng)建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"http:// 添加這一行 }
android { buildTypes { release { //添加這一行 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
配置iOS
- firebase控制臺秃嗜,創(chuàng)建iOS應用
- 下載
GoogleService-Info.plist
,放到ios/Runner
路徑下 -
ios/Podfile
如下顿膨,運行pod install
安裝依賴:platform :ios, '13.0'
- 設置Xcode锅锨,以自動上傳
調(diào)試符號 (dSYM)
文件到firebase控制臺:- Xcode -> Runner.xcodeproj -> targets:
-
Building Settings -> All,完成以下步驟恋沃,以便 Xcode 為您的 build 生成 dSYM:
- 搜索
debug information format
必搞,對所有build,將Debug Information Format(調(diào)試信息格式)
設置為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控制臺霜第,注意他們之間的區(qū)別:Future<void> main() async { /// 捕獲所有未捕獲的 Dart 異常 ///自動捕獲在普通 Dart 代碼中發(fā)生的 同步異常(例如 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 框架層 發(fā)生的錯誤户辞,例如構建泌类、繪制和布局過程中的異常。 //它不會自動捕獲在普通 Dart 代碼中發(fā)生的 同步異常(例如 list 越界 錯誤)底燎, //這些同步異常通常需要在 runZonedGuarded 或 catchError 中進行處理 FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; }
- 強制崩潰刃榨,并在firebase控制臺查看崩潰日志:
///主動崩潰 FirebaseCrashlytics.instance.crash(); ///數(shù)組越界,崩潰 List<String> list = ['123']; String str = list[1];
??????報錯
-
由于初始化找不到參數(shù)配置书蚪,出現(xiàn)
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();
替換成換個帶參數(shù)的初始化方法:Firebase.initializeApp( options: const FirebaseOptions( apiKey: '?????', appId: '?????', messagingSenderId: '?????', projectId: '????'));
- 對應的參數(shù)在
Android/app/google-services.json
,或者iOS/Runner/GoogleService-Info.plist
可以找到:-
apiKey
<---->current_key
-
appId
<---->mobilesdk_app_id
-
messagingSenderId
<---->project_number
-
projectId
<---->project_id
-
- 對應的參數(shù)在
- 解決方法喇澡, 把
其他