FlutterアプリをiOSで実行した際に「A Firebase App named “[DEFAULT]” already exists」エラーになる場合の対処 その2

結論:flutter cleanコマンドで古いFirebase Projectの情報を完全に削除する
2022.10.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、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.dartios/Runner/GoogleService-Info.plistのプロジェクト情報に不整合はありませんでした。

調査、解決

まず、main.dartの記述を修正して、Appを名前付きで初期化して重複によるエラーを回避するようにし、また生成されたAppsが紐づくProject IDを出力するようにします。

lib/main.dart

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のコードの記述を戻し、再度アプリを実行すると、今度は問題なく起動できるようになりました!

以上