遅ればせながら、Xcode16対応が終わっていなかったアプリがあったため、適用作業をしていたところ、以前は解消できたはずの
/Users/####/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.1.0/ios/Classes/Crashlytics_Platform.h:21:9 Include of non-modular header inside framework module 'firebase_crashlytics.Crashlytics_Platform': '/Users/####/ios/Pods/Headers/Public/Firebase/Firebase.h'
/Users/####/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.1.0/ios/Classes/ExceptionModel_Platform.h:21:9 Include of non-modular header inside framework module 'firebase_crashlytics.ExceptionModel_Platform': '/Users/####/ios/Pods/Headers/Public/Firebase/Firebase.h'
のエラーがなかなか解消できず、苦労したので、その備忘録です。
結論としては、Xcodeの「Build Settings」で、
「Allow Non-modular includes in Framework Modules」を「YES」にする
対応を、「TARGETS」の「Runner」ではなく、「PROJECT」の「Runner」に対してやってしまっていたのが原因でした(常識だったのかもしれませんが…)。
以降では、同じ問題に直面した方のご参考になればと思い、その過程を共有します。
前提とする環境
- PC:MacBook Pro(Intel Core i5)
- OS:macOS Sonoma 14.5
- Flutter:3.19.6
- Android Studio:Koala 2024.1.1 Patch 1
- Xcode:16.2
エラーが発生した状況
下記エラーは、Flutterで開発したアプリを、Xcode16でビルドした際に発生しました。
(再掲)
/Users/####/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.1.0/ios/Classes/Crashlytics_Platform.h:21:9 Include of non-modular header inside framework module 'firebase_crashlytics.Crashlytics_Platform': '/Users/####/ios/Pods/Headers/Public/Firebase/Firebase.h'
/Users/####/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.1.0/ios/Classes/ExceptionModel_Platform.h:21:9 Include of non-modular header inside framework module 'firebase_crashlytics.ExceptionModel_Platform': '/Users/####/ios/Pods/Headers/Public/Firebase/Firebase.h'
様々なOSバージョンのシミュレーターや実機で試しましたが、いずれの環境でもエラーが発生しました。
試したこと(いずれも解消できず)
WebサイトやChat-GPT・Geminiなど(以下、「Chat-GPT達」)からのアドバイスに基づき、試したことを列記します。
①:Xcodeの「Build Settings」の「Allow Non-modular includes in Framework Modules」を「Yes」にしてもダメ
すぐ見つかるのがこの対策なので、真っ先に試しましたが、エラーを解消できませんでした。
以前、別のアプリでは、これで解消できたので、採用しているFlutter SDKやパッケージ類のバージョンが古いからだろうか、、、と悩みました。
※ただ、前述のとおり、このやり方自体が正しくなかったのですが…。
②:Podfileに「['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'」を追記してもダメ
これもよく見かける対策で、Podfileの以下の部分に、設定を追記する方法です。
post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| # ↓ これを追記 config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES' end end end
Xcodeの「Build Settings」を変えるのと同じに思えましたが、Chat-GPT達からも提案されたので、念のため試したところ、やはりエラーは解消できませんでした。
③:「pod deintegrate」など徹底的にクリーンアップしてもダメ
Chat-GPT達からは、下記の徹底的なクリーンアップ処理も勧められました。
cd ios // XcodeプロジェクトからのCocoaPodsの統合を完全に解除 pod deintegrate // CocoaPodsのキャッシュをクリア pod cache clean --all // PodsディレクトリとPodfile.lockファイルを完全に削除 rm -rf Pods Podfile.lock // Podを再インストールし、リポジトリを更新 pod install --repo-update
しかし、エラーは解消されませんでした。
④:パッケージの直接修正は実行せず
最後に、以下のパッケージのファイルを直接修正するよう、提案がありました。
/Users/[ユーザー名]/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.1.0/ios/Classes/Crashlytics_Platform.h /Users/[ユーザー名]/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.1.0/ios/Classes/ExceptionModel_Platform.h
これらのファイルの #import <Firebase/Firebase.h>
を @import Firebase;
に置き換えるという方法ですが、パッケージのソースをいじる勇気がなかったので、採用しませんでした。
解消できた(=誤りに気づいた)理由
fvm経由で、古めのFlutter SDKのバージョンを使用していたため、Firebase関連のバージョンを上げられない状況でした。
Chat-GPT達からは、Firebase関連のバージョン不整合の影響指摘もあったので、Flutterのバージョンを上げるしかないか、、と諦め気味になりましたが、以下の記事の画像をよく見ると、
前述①の「Build Settings」の設定変更は、「TARGETS」の「Runner」の方に実施されていると気づきました。
これに対し、自分のXcodeを見ると、「PROJECT」→「Runner」→「Build Settings」の方になされており、「TARGETS」→「Runner」→「Build Settings」の「Allow Non-modular includes in Framework Modules」は、「No」のままでした。。(「PROJECT」と「TARGETS」で設定が連動しないとは、思いもよりませんでした…)。
早速、「TARGETS」→「Runner」→「Build Settings」の「Allow Non-modular includes in Framework Modules」を「Yes」に変更し、ビルドしたところ、エラーは解消されました!
こちらのイシューなどでも、「PROJECT」か「TARGETS」かは意外と書かれていないので、盲点でした(常識なのかもしれませんが…)。
なお、Podfileへの追記(前述②)は、対応不要でした。
どうやら、以前、別アプリのXcode16対応をしたときは、たまたま「TARGETS」の方に設定したため、エラーが出なかったようです。
※今回は、下記記事(とても分かりやすい記事で大変助かりましたが)の説明画像にて、「PROJECT」を選択しているように見えたため、「PROJECT」の方に設定していました。
補足:なぜ「PROJECT」だとダメか?Podfileの記載箇所は「TARGET」だったはずでは?
恥ずかしながら、未だ理解が乏しいため、疑問点を少しだけ確認してみました。
「PROJECT」に設定するとダメな理由
Chat-GPTに、なぜ「PROJECT」の「Runner」に対する設定だとダメなのか、聞いてみたところ、
- 「PROJECT」側の設定は、初期値として使われるだけ
- 実際のビルドでは、「TARGET」側の設定が優先される
- よって「TARGET」の「Build Settings」が未変更(「No」のまま)だと、実際のビルドには反映されない
とのことでした。なるほど。。
今更ですが、「PROJECT」と「TARGET」の違いについても理解が必要だと思い、下記記事で学ばせていただきました(ありがとうございます!)。
Podfileでターゲットレベルに設定してもダメだった理由
ターゲットレベルでの設定が必要、という点は分かりましたが、前述②の試行で、Podfileに
['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES'
の記述を、
target.build_configurations.each do |config|
から始まるターゲットレベルの所に書いてたので、これでもエラーを解消できたはずでは?と思いました。
この点もChat-GPTに尋ねたところ、
- CocoaPods は、あくまで Podsプロジェクトとそのターゲット(依存ライブラリ) を管理するもの
- Flutterアプリ本体である Runner は Flutter により生成された独立したターゲットであり、Podfile が明示的には管理していない
- したがって、Podfile の post_install ブロックに記述しても、Runner ターゲットには設定が伝わらない
とのことでした。
最初から教えて…と思ったりもしましたが、自分自身、AIエージェントを使いこなす技量が足りていないところです(とは言え、ほとんどのエラーは「Chat-GPT達」で解消できているので、大変助かっていますが)。
以上、どなたかのご参考になれば幸いです。
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/
コメント