LoginSignup
0
0

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

Posted at

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

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

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

結論

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

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

Firebaseが指示する手順(2024年6月1日現在)

スクリーンショット 2024-06-01 9.46.08.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 をすれば良いという記事を見つけました。

参考記事

結果

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

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

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

スクリーンショット 2024-06-01 20.08.55.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

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

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

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

スクリーンショット 2024-06-01 21.35.04.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

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

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

スクリーンショット 2024-06-01 23.15.08.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

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

スクリーンショット 2024-06-01 23.07.50.png

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

感想

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

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

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

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0