--- tags: Flutter --- # Flutter 導入 Firebase Analytic 以及 Crashlytics 為了可以更好掌控上架APP的使用者使用情況以及錯誤訊息,因此在評估後決定先使用Firebase提供的Analytics以及Crashlytics這兩大服務,目前這兩個服務皆為免費使用,但因為免費,所以資料的保存期限就無法持久,而資料保存目前並不是我們需求的重點,故而決定先使用Firebase。Analytic可以用來收集以及分析使用者行為,而Crashlytics則可以收集APP錯誤或是崩潰時的訊息。 在這份筆記中,會紀錄一個新開的Flutter專案導入Firebase的過程。 ### Firebase建立專案 第一步就是需要在Firebase上面建立一個專案,在建立專案完成後,就可以直接在專案上面新增應用程式。因為我的目標是在既有的專案中加入Firebase套件,雖然在文件中有說最簡單的方式是可以透過FlutterFire CLI來完成,但我本人其實對於這種可以一鍵完成的東西會比較警慎一點,畢竟他做了什麼我也不曉得,萬一完成後專案跑不起來也會增加自己要除bug的風險。所以我選擇另一種比較麻煩的方式,就是自己手動處理。 ### Android 專案設置 首先,先來新增Android專案, ![](https://i.imgur.com/yXvd7DU.png) 接下來填上AppId以及專案暱稱。 ![](https://i.imgur.com/wkOFEFg.png) 然後下載設定檔到Android專案中。 ![](https://i.imgur.com/gExlFOX.png) 接下來就是按造說明在root層gradle中新增設定: ```groovy dependencies { classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.13' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' } ``` 於app層級的gradle中新增以下設定: ```groovy dependencies { implementation platform('com.google.firebase:firebase-bom:31.0.2') implementation 'com.google.firebase:firebase-analytics' implementation 'com.google.firebase:firebase-crashlytics' } ``` ```groovy apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' ``` 以上就完成了Android的設定。 ### iOS 設置 如同Android 在平台上面選擇iOS。 ![](https://i.imgur.com/v3fS70r.png) 填上必要資訊。 ![](https://i.imgur.com/Lsh3DdH.png) 下載google設定擋到專案之中。 ![](https://i.imgur.com/fS1ODl4.png) 再來是調整一下Deployment Target版本: ![](https://i.imgur.com/V58AmYO.png) 以上iOS就設置完成了,不用再另外對其進行Firebase的SDK導入。如果在pubspec.yaml中有引用firebase的東西的話,Flutter在build ios的時候時,就會自動透過cocoapod直接下載相關的SDK專案中。 **Firbase iOS Crash Report相關設定** Firebase Crashlytics解析報告會需要用到dSYM檔,不然報告會無法解析,根據以下設定可以在build專案的時候自動將dSYM檔上傳到firebase上。 1. 建立Run Script Phase ![](https://i.imgur.com/qQ2gVWU.png) 2. 填入以下script ``` ${PODS_ROOT}/FirebaseCrashlytics/run ``` ![](https://i.imgur.com/gWisBQI.png) 3. Input Files設定 ``` ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME} ``` ``` $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH) ``` ![](https://i.imgur.com/sZyCJ1G.png) 4. 調整Dedug Information Fromat 都調整成DWARF with dSYM File。 ![](https://i.imgur.com/vo0HQqQ.png) 最後再AppDelegate中加入初始化Firebase的程式碼。 ```swif import UIKit import Flutter import FirebaseCore @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication,flutt didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FirebaseApp.configure() //初始化Firebase GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } } ``` ### Flutter 設置 完成了兩個平台的設置後,最後在Flutter中新增Plugin就差不多已經全部設置完成。 ```yaml dependencies: flutter: sdk: flutter firebase_core: ^2.1.1 firebase_analytics: ^10.0.3 firebase_crashlytics: ^3.0.3 ``` ### Crash Test 可以透過以下程式碼觸發程式崩潰,而crash的資訊則會在下次APP開啟後才會傳送至firebase。 ```dart= FirebaseCrashlytics.instance.crash(); ``` 以下是crash收到後的結果: ![](https://hackmd.io/_uploads/Hy0VOOUuh.png) ![](https://hackmd.io/_uploads/SkXS_uL_2.png) 可以透過紀錄檔分頁查看使用者的操作情況。 ![](https://hackmd.io/_uploads/Bkx0u_Uuh.png) 資料的部分則可以提供使用者的設備型號等資訊。 ![](https://hackmd.io/_uploads/rJZztd8dn.png) ### Debug測試 因為分析的數據可能需要數個小時才會真的在控制面板中顯示出來,所以Google就在控制頁面中提供DebugView,供我們在測試時可以及時的知道資訊是否有發送出去並被接收。 ![](https://i.imgur.com/YLQtNHF.png) #### Android 但是要使用這種模式的話,Android需要透過已經command才能執行: ``` adb shell setprop debug.firebase.analytics.app com.your.applicationid ``` 如果要停止測試模式,可輸入以下command: ``` adb shell setprop debug.firebase.analytics.app .none. ``` #### iOS iOS則要在以下設定頁面中新增參數: Product -> Scheme -> Edit Scheme... ![](https://i.imgur.com/bJUFYLh.png) 在左邊的選單中選擇Run,並在Arguments這頁中的Arguments Passed On Launch 加上 ``` -FIRDebugEnabled ``` 專案run起來後狀態就會維持Debug模式。 ![](https://i.imgur.com/BgWqw59.png) 如果要關閉Debug模式,則在相同的地方新增一下參數: ``` -FIRDebugDisabled ``` 並且將啟動的參數勾選取消,再重新執行專案即可。 ![](https://i.imgur.com/jQjnyr8.png) 關於iOS的設定,也可以參考以下網頁資訊: https://medium.com/@eason2019tw/ios-swift-%E5%95%9F%E7%94%A8ios-google-analytics-%E7%9A%84debugview-%E6%A8%A1%E5%BC%8F-28f235e2f120 ## 在Flutter中的起手式 Firebase的初始化: ```=dart void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp().whenComplete((){ runApp(const MyApp()); }); } ``` 使用Analytics觸發events: ```=dart var firebaseAnalytics = FirebaseAnalytics.instance; firebaseAnalytics.logAppOpen(); //觸發App開啟Event ``` 除了AppOpen這種預設的Event以外,還有許多其他的預設Event可供使用: ![](https://i.imgur.com/5Wdz90E.png) 如果這些預設的Event都不符合使用,也可以自定義Event: ```=dart var firebaseAnalytics = FirebaseAnalytics.instance; firebaseAnalytics.logEvent( name: "button_click", parameters: { "button_name" : "increment button" }); ```