FlutterアプリにCrashlyticsを導入する。
前提
- FlutterアプリのFirebaseプロジェクトを作成済み
- Firebaseプロジェクト設定から、AndroidアプリとiOSアプリを登録して、GoogleService-Info.plistを取得済み
ビルド設定
基本
FlavorでFirebaseのプロジェクトを分ける場合
"develop"と"production"の2つのFlavorでFirebaseのプロジェクトを分けているとする。
flavor導入の設定は済んでいる前提。
iOSの設定手順
全てXCode上の操作。
- ios/Runner.xcodeworkspaceをXCodeで開く
- GoogleService-Info.plistの設定(Runnerフォルダ配下)
- develop向けにGoogleService-Info-develop.plistを追加
- production向けにGoogleService-Info-dev.plistを追加
- GoogleService-Info-dev.plistを追加
- Target MembershipにRunnerを含めること
- 中身は適当でも大丈夫のはず
- XCodeのトップ階層にあるRunnerを開く(フォルダでなく、.xcodeprojの方)
- Build Phasesを開く
- 画面上の方の+ボタンからNew Run Script Phaseを選択
- Build Phansesの最後に「Run Script」が追加されるので、上の方にある「Check Pods Manifest.lock」の直後に移動する
- 名前も分かりやすい名前に変えておくと良い
- 「Replace GoogleService-Info.plist」など
- flavor別のGoogleService-Info.plistを所定の場所と名前でコピーする
- 追加したRun Script Phaseに、以下のスクリプトを書く。
# $CONFIGURATIONは、Build Configurationの名前が入る。
# Build Configurationにflavor名を含めていることが前提の判別方法。
if [[ $CONFIGURATION == *"develop"* ]]; then
cp $SRCROOT/Runner/GoogleService-Info-develop.plist $SRCROOT/Runner/GoogleService-Info.plist
else
cp $SRCROOT/Runner/GoogleService-Info-production.plist $SRCROOT/Runner/GoogleService-Info.plist
fi
8. 追加したRun Script PhaseのOutput Filesに、「$SRCROOT/Runner/GoogleService-Info.plist」を追加する
9. ${PODS_ROOT}/FirebaseCrashlytics/runを実行しているPhaseのInput Filesに「$SRCROOT/Runner/GoogleService-Info.plist」を追加する(基本の手順に従って、$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)を追加している場合は、そちらは削除してOK)
Android
- android/app/developに、develop向けGoogleService-Info.plistを置く
- android/app/productionに、production向けGoogleService-Info.plistを置く
(ファイル名にflavor名は含める必要なし)
Dart
Crashlyticsを使うための準備処理をmain()あたりに書く。
main.dart
void main() async {
WidgetsFlutterBinding.ensureInitialized(); # これをしておかないと、Firebase.initializeApp()がエラーになる
await Firebase.initializeApp();
// DartのエラーをCrashlyticsに報告する
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
// Dart以外のエラーログをCrashlyticsに報告する
Isolate.current.addErrorListener(RawReceivePort((pair) async {
final List<dynamic> errorAndStacktrace = pair;
await FirebaseCrashlytics.instance.recordError(
errorAndStacktrace.first,
errorAndStacktrace.last,
);
}).sendPort);
runApp(App());
}
後は、クラッシュさせて見て試す。以下の処理でクラッシュさせられる。
FirebaseCrashlytics.instance.crash();