Firebase In-App MessagingをCocoaPodsで導入するとビルドエラーになる
既存のプロジェクトに Firebase In-App Messaging を導入してみようということで、CocoaPods 経由で SDK を入れてみてビルドしたところエラーになって右往左往しつつも、原因とその解決策が分かったのでそこらの話し。
環境
- Xcode v13.4
- CocoaPods v1.11.3
- Firebase v9.1
詳細
CocoaPods での導入自体は特に変わったことなくいつものとおり、Podfile にこちらのページを参考して記入するだけです。
こんな感じ。
platform :ios, '13.0'
target 'LocariMagazine' do
use_frameworks!
pod 'FirebaseAnalytics'
pod 'FirebaseCrashlytics'
pod 'FirebaseInAppMessaging' # これを追加
end
既存のプロジェクトに追加したので、他にもいくつか記載されてますけれど、In-App Messaging に限って言うと FirebaseInAppMessaging
が対象です。
ここからいつものように pod install
をたたけば完了です。
その状態からビルドをすると下記のようなエラーがでます。
'FirebaseCore/FIRLogger.h' file not found
いつもなら、Podsでなにかビルドエラーが出た場合、Clean & Build とか Xcode 再起動とか DerivedData 配下を削除などで解決できたりするのですけれど、今回はそのいずれも全然だめでした。
原因
この状態で Podfile.lock(あるいは pod install のログ)をみるとわかるのですが、FirebaseInAppMessaging
のバージョンが 0.13.0 というかなり古そうなものが入っていることに気づけます。
そこで、リポの FirebaseInAppMessaging.podspecのバージョン をみてみると 9.1.0-beta
とあって、あきらかに全然ちがう物が入ってきていることがわかりました。
なぜこの最新バージョンが入ってこないのだろう?ということなのですけど、この beta という記述が問題になっていそうです。
CocoaPods 側のドキュメント等で見つけられなかったのですが、おそらくですがバージョンで beta などと suffix 指定がある場合は、プレリリース扱いとなり最新バージョンとして扱われなくてインストールしないという挙動になっていそうです。
なので、Podfile でバージョン明示がなく最新をいれようとすると、beta など suffix 指定がないもので最新ということで、0.x のバージョンが入ってきているという感じです。
(0.xも0.26とかあるのですけど、多分ほかとの依存関係の問題でそれが入ってきているだけかと)
実際、 FirebaseInAppMessaging.podspec をさかのぼっていくと、0.x のバージョンは suffix はとくになく、メジャーバージョンが上がってからは suffix に beta がつくようになってます。(多分途中でbetaの扱い方が内部で変わったのでしょう)
ということでまとめると、FirebaseInAppMessaging
が beta バージョンであること、CocoaPods がプレリリースは自動では入れない仕様というのがあっての今回のエラーが発生してそうだということに。
解決策
なので、解決策は簡単で、Podfileで入れたいバージョンを明示してあげるということです。
こういう感じです。
platform :ios, '13.0'
target 'LocariMagazine' do
use_frameworks!
pod 'FirebaseAnalytics'
pod 'FirebaseCrashlytics'
pod 'FirebaseInAppMessaging', '~> 9.1.0-beta'
end
これで入れ直してあげると、ちゃんとそのバージョンが入ってきて無事にビルドもできるようになります 🎉
参考
- Install pre-release versions only if explicitly asked by the user · Issue #1489 · CocoaPods/CocoaPods
プレリリースは自動では入れないってのはこの時にはいった仕様なのかも。2013年か…