FlutterアプリにFirebaseのIn-App Messagingを入れようとして、iOSビルドが出来なくてハマったのでその解決方法をメモとして共有します。
環境など
ツールなど | バージョンなど |
---|---|
MacBook Air Early2015 | macOS Mojave 10.14.6 |
Android Studio | 3.6.1 |
Java | 1.8.0_131 |
Flutter | 1.12.13+hotfix.9 |
Dart | 2.7.2 |
Xcode | 11.3.1 |
導入手順
In-App Messagingは、基本的にライブラリを導入するだけで、コーディングはする必要が無いものです。(受け取って標準的な表示をするだけなら)
なので、以下だけでやりました。
1.依存関係を追加
Flutter用のパッケージはこちらにあります。
https://pub.dev/packages/firebase_in_app_messaging
firebase_in_app_messaging: ^0.1.2
pub getして、ビルドしました。
2.キャンペーンを作成
Firebaseの以下のページからキャンペーンを作成します。
「新しいキャンペーンの作成」をクリックすると、以下のような画面になります。
画像が必須なので頑張って何か入れてください。
(横向き用に画像が潰れるのはなんとかならないのか・・・)
ところで、In-App Messagingって、まだベータ版なんですね・・・
Androidは、これで基本的には上手くいきます。
私はService fetch error: PERMISSION_DENIED: Firebase In-App Messaging API has not been used
というエラーが出てしばらく表示されなかったのですが、google-services.json
をダウンロードし直してきたら直り、無事表示が出来ました。
エラー内容
問題は、iOSで表示しようとビルドしたときです。
以下のようにビルドエラーが出ました。
duplicate symbol '_OBJC_CLASS_$_ "FIRIAMDefaultDisplayImpl'"
どうやら、以下のパッケージで同じクラス定義がありシンボルが重複しているというエラーのようです。
- FirebaseInAppMessaging
- FirebaseInAppMessagingDisplay
解決方法
いろいろググって辿り着いたのが、FirebaseのIssuesページです。
こちらにある、FirebaseとIn-App Messagingのバージョンを強制的に指定することで解決しました。
※ダウングレードしていることになるので、他のFirebaseのパッケージが整合性取れなくなる可能性があります。対応にはご注意下さい。
具体的には、以下のバージョンを強制的に指定することにします。
- Firebase (6.15.0)
- FirebaseInAppMessaging (0.16.0)
(1)Podfileを編集する
どうするかというと、Podfile
ファイルを編集します。
# avoiding to duplicate symbol error
pod 'Firebase', '6.15.0'
pod 'FirebaseInAppMessaging', '0.16.0'
(2) Podfile.lock
を削除
Podfile.lock
はプロジェクトフォルダのios
フォルダ下にあります。
(3) flutter clean
を実行
$ flutter clean
(4) pod install
を実行
$ pod install
(5) Flutterでビルド、実行する
これで無事ビルドが通り、メッセージもちゃんと表示出来ることを確認しました。
2.修正状況
関連の修正PRは出ているようですので、注視しておくと良いかも知れません。
https://github.com/FirebaseExtended/flutterfire/pull/1957
https://github.com/FirebaseExtended/flutterfire/pull/2701
In-App Messagingのススメ
Push通知(Firebase Cloud Messaging)と違って、アプリを起動したときにしか表示してくれませんが、Pushよりずっと楽に導入できるので、アプリのアップデートの案内とか、アップデートした後の新機能の紹介とか、アプリを起動した上でのメッセージ表示で十分な場合は、かなりオススメです。
特にiOSの場合、証明書の更新とかも不要になるので、運用的にかなり助かるのではないでしょうか。
と言うことで、頑張ってPush通知を導入するより、In-App Messaging導入、いかがでしょうか?
今回、In-App Messagingを入れることにしたのは理由があって、アプリの強制アップデートのためにRemote Configを使っているのですが、iOS9.3のiPadで、一度読み込んだらその後値を一切再取得してくれないという不具合に気付き、そこで、iOS10未満の端末向けに、最初はPush通知を入れようかと思ったのですが、証明書やらでハードルが高いので、お手軽そうなIn-App Messagingを試してみた、という次第です。
というか、これで、自前の強制アップデートダイアログの表示も不要になりますね。
ナンテコッタイ\(^o^)/
まあ、まだベータなので・・・というところが、業務で導入するには躊躇うところでしょうか^^;