FlutterアプリをiOSで実行した際に「A Firebase App named “[DEFAULT]” already exists」エラーになる場合の対処 その2
こんにちは、CX事業本部 IoT事業部の若槻です。
以前に下記エントリで、FlutterでiOSアプリを実行時にデフォルト名のFirebase Appが複数初期化されてしまいエラーとなる事象の対処についてご紹介しました。
しかし今回、また同じエラーが発生したのですが、前回とは異なるアプローチでの解決が必要でしたので、対処した内容をまた共有します。
導入
前回と同様、iOS SimulatorでFlutterアプリを実行すると、A Firebase App named "[DEFAULT]" already exists
というエラーが発生してアプリが起動できません。
$ flutter run -d E34E6488-5350-4BFB-9E66-C3CFAE6E451B Launching lib/main.dart on iPhone SE (3rd generation) in debug mode... Running Xcode build... └─Compiling, linking and signing... 2,787ms Xcode build done. 10.7s [VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: [core/duplicate-app] A Firebase App named "[DEFAULT]" already exists
しかし前回原因となった、lib/firebase_options.dart
やios/Runner/GoogleService-Info.plist
のプロジェクト情報に不整合はありませんでした。
調査、解決
まず、main.dart
の記述を修正して、Appを名前付きで初期化して重複によるエラーを回避するようにし、また生成されたAppsが紐づくProject IDを出力するようにします。
import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'firebase_options.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); //Appを名前付きで初期化 await Firebase.initializeApp( name: 'hoge', options: DefaultFirebaseOptions.currentPlatform); //生成されたAppsが紐づくProject IDを出力 Firebase.apps.forEach((e) { print(e.options.projectId); }); runApp(const MyApp()); }
すると、現在使用しようとしているFirebase ProjectのIDに加えて、wakatsuki-20221003
という少し前に使っていたProject IDが取得されました。
$ flutter run -d E34E6488-5350-4BFB-9E66-C3CFAE6E451B Launching lib/main.dart on iPhone SE (3rd generation) in debug mode... Running Xcode build... └─Compiling, linking and signing... 3.6s Xcode build done. 18.0s flutter: wakatsuki-20221003 flutter: current-project Syncing files to device iPhone SE (3rd generation)...
このProject IDでFlutterプロジェクト内を検索してみると、iOS
や.dart_tool
内のファイルがヒットしました。ビルドにより生成されたアーティファクト内に情報が残っているようです。
$ grep -r wakatsuki-20221003 ./projects Binary file ./projects/cm-rwakatsuki/flutter-app/build/ios/Debug-iphonesimulator/Runner.app/GoogleService-Info.plist matches Binary file ./projects/cm-rwakatsuki/flutter-app/build/ios/iphonesimulator/Runner.app/GoogleService-Info.plist matches Binary file ./projects/cm-rwakatsuki/flutter-app/.dart_tool/flutter_build/a540aec9285e8eee5331cad4c91bd117/app.dill matches
そこでflutter clean
コマンドを実行して、今までのビルドにより生成されたファイルをクリーンします。
$ flutter clean $ flutter pub get # flutter cleanにより削除されたライブラリを再インストール
main.dart
のコードの記述を戻し、再度アプリを実行すると、今度は問題なく起動できるようになりました!
以上