【Xcode】ios/Runner.xcodeproj Missing package product 'FirebaseAnalytics'というエラーの解決

こんにちは、私はXcode、Flutter、iOSアプリの開発初心者です。そして、非開発者です（インフラエンジニアと名乗っています）。

今回、Flutterを使って開発したクロスプラットフォームのアプリケーションをXcodeでビルドする際に、以下のエラーが出ました。

```
/Users/[ユーザー名]/Downloads/[Flutterプロジェクト名]/ios/Runner.xcodeproj Missing package product 'FirebaseAnalytics'
```

## 結論

* **<INS>FirebaseプロジェクトにiOSアプリを追加する際に、Firebaseが指示する以下の手順は、Flutterでの開発においては不適切</INS>**（と思っています）

* **<INS>Flutterでの開発においては、下記手順の代わりに、pubspec.yamlファイルのdependenciesセクションにfirebase_analyticsを追加するのが良さそう</INS>**（analyticsの動作は未確認）

### Firebaseが指示する手順（2024年6月1日現在）

![スクリーンショット 2024-06-01 9.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/938954da-e179-d3b1-1ef2-c51be84f1b71.png)


## この記事の想定読者

この記事の想定読者は、FlutterフレームワークやXcodeでのビルドに慣れていない方、コンパイルの仕組み（ヘッダーが何に使われるか等）やアプリケーションのパッケージ管理に明るくない方です。

この後の文章は、上記の結論とは関連性が薄く感じるかもしれませんが、同じようなことで悩まれる方に役に立つ可能性があると考えています。

## 問題解決の決め手

今回の問題解決の決め手はChat-GPTからの回答でした。（それ以外にも、GitHub Copilotと壁打ちしたり、ネット記事を調べることもして、自分の認識の変化に影響がありました）

## 私の問題切り分け体験

### 問題の環境情報

* Flutter 3.22.0
* Xcode 15.4
* バックエンド Firebase
* 問題の切り分けと解決を行った時期 2024年6月1日

### Missing Package Product ‘パッケージ名’ エラーへの対処

```
Missing Package Product ‘パッケージ名’
```

というエラーが出たら、

Reset Package Caches　をすれば良いという記事を見つけました。

#### 参考記事
https://qiita.com/yuki-naka/items/c5958688c6d9e5ef94cd

#### 結果

私の環境では効果はありませんでした。

この結果によって、Missing Package Product ‘パッケージ名’ のエラーが出る原因は複数あると認識しました。（今回は上記記事の原因とは違うと理解しました）

GitHub Copilotも flutter clean をするといった、似たような方法を推奨してきました。

![スクリーンショット 2024-06-01 20.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/cc79d9d3-1dff-591f-c24a-eaaf8f01e2bc.png)


また、Reset Package Caches をすることで、以下のエラーが私の環境では必ず出ました。


### Reset Package Caches することで出たエラー

```
failed to emit precompiled header '/Users/[macOSのユーザー名]/Library/Developer/Xcode/DerivedData/Runner-ghalhcbjabzahedsbmkwcczbtxlg/Build/Intermediates.noindex/PrecompiledHeaders/Runner-Bridging-Header-swift_1O4OMIIF0C3Q4-clang_2A1JQBCCXRNNN.pch' for bridging header '/Users/kdoi/Downloads/test_app4/ios/Runner/Runner-Bridging-Header.h'
```

![スクリーンショット 2024-06-01 8.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/5265e854-d605-f725-143d-e5d00788ae41.png)


このエラーの解決方法をChatGPTに聞くと、

```
rm -rf ~/Library/Developer/Xcode/DerivedData
```

をすることや、Xcodeでの Clean Build Folder を勧められました。

![スクリーンショット 2024-06-01 21.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/0c5aca33-784d-1d63-3868-a4866d0964eb.png)

そうすると、該当のエラーは出なくなりますが、 Missing Package Product ‘パッケージ名’ のエラーが出ます。

深く考えずにエラー内容をAIのチャットに貼り付けて問い合わせることを繰り返した私は、このタイミングからAIとのやり取りが無限ループすることになりました。

### 無限ループから抜け出たきっかけと問題解決

何度も遭遇した

```
failed to emit precompiled header '/Users/[macOSのユーザー名]/Library/Developer/Xcode/DerivedData/Runner-ghalhcbjabzahedsbmkwcczbtxlg/Build/Intermediates.noindex/PrecompiledHeaders/Runner-Bridging-Header-swift_1O4OMIIF0C3Q4-clang_2A1JQBCCXRNNN.pch' for bridging header '/Users/kdoi/Downloads/test_app4/ios/Runner/Runner-Bridging-Header.h'
```

のエラーについて深掘りを試みた際に、Bridging Headerファイルのパスが正しくない という原因がChatGPTから示唆されました。

![スクリーンショット 2024-06-01 23.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/010eaf8c-ea16-1e4d-1f84-51be160aebb0.png)

```
rm -rf ~/Library/Developer/Xcode/DerivedData
```

をすると、Bridging Headerに関するエラーが出なくなる理由を深掘りする中で、Missing package product 'FirebaseAnalytics' というエラーの対象になっているパッケージ 'FirebaseAnalytics' はSwiftで使用されるパッケージであることが見えてきました。

![スクリーンショット 2024-06-01 23.15.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/a02f9d60-b458-6228-03af-02c1422dd401.png)

私はSwiftを使用して開発しているつもりはなかったので、Swiftを使用する場合とFlutterを使用する場合では、パッケージ管理の仕組みが異なるという仮説が頭に浮かびました。

Firebaseが指示する手順（Xcodeの Add Package Dependency...（この操作によりSwift Package Manager（SPM）を使用することになると理解しています）から FirebaseAnalytics を追加する）と、Flutterのpubspec.yamlファイルのdependenciesセクションにパッケージ名を記載する場合（この場合はCocoaPodsを使用することになる）では、パッケージのインストール方法は異なる（Swift Package Manager と CocoaPods を使用する目的は同じだが仕組みが別である）と理解しました。

Swift Package Managerを使用すると、XcodeのGeneral画面の Frameworks, Libraries, and Embedded Content にパッケージ名が記載されるようです。しかし、Flutterを用いて開発すると、パッケージ管理システムとしてCocoaPodsが採用され、Swift Package Managerで追加したパッケージ（Frameworks, Libraries, and Embedded Content に表示されるパッケージ）をビルド時に認識しないのだと理解しました。

![スクリーンショット 2024-06-01 22.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/a994de01-7476-dc43-383c-b7357b62c4e4.png)

ChatGPTに確認したところ、その理解が検討はずれではないことが示されました。

![スクリーンショット 2024-06-01 23.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438423/196e8a1d-b612-1fd7-912a-140e5bb42a91.png)

Frameworks, Libraries, and Embedded Content の一覧から　FirebaseAnalytics を削除すると、エラーなくビルドが完了したので、今回の結論の通りとしました。

## 感想

今回の問題を解決するまでに、合計10時間ほどかかりました。途中から、今回の問題の原因はXcodeやFlutterのバグだと私は思い始めていましたが、結論が出たときに、ただ自分がXcodeやFlutter、Swift、CocoaPodsの仕組み、コンパイルやヘッダーの何たるかをよく理解してないだけだったと振り返りました。

アプリケーション開発において原因の特定に時間がかかりそうなときは、ツールのバグではなく自分の知識不足を疑ったほうが問題解決に近づきやすいと私は認識しました。

この記事が誰かの役に立てば嬉しいです。記事の内容に指摘点や質問があれば、コメントをお願いします。

以上です。