Firebase In-App Messaging を使って特定のユーザーにメッセージを通知する
クラスメソッド福岡オフィスでiOSアプリエンジニアとして働いている田辺です。先日業務で Firebase の In-App Messaging に触れる機会がありました。今回は特定の属性をもつユーザーに対して通知を行うところまでをやってみたので、基本的なところから説明しながら記事にしていきます。
In-App Messagingとは
アクティブなユーザーへのメッセージの表示を行うことができるサービスです。Firebase コンソールからメッセージのデザインをカスタマイズできます。タイトルやボディ、テキストや色などが設定できます。
ルーティング先のURLを設定することでボタンが押下されたときに遷移処理を行えます。
The Firebase Blog: Introducing Firebase In-App Messagingによると、アプリ内メッセージングで送信されるメッセージの主な目的は、アクティブなユーザーをアプリ内の主要なアクション(購読、ビデオの視聴、レベルの完了、アイテムの購入など)を行うよう背中を押すこととあります。
また、Firebase Cloud Messagingを介して送信されるメッセージを補完するものと位置付けられています。
検証環境
- Xcode Version 10.3
- Swift5.0
- iOS 10.3
- CocoaPods 1.7.5
iOS のバージョンは機能改修中のアプリケーションの iOS のバージョンになります。
導入
今回はCocoaPodsを使って導入します。
Podfileに以下のように追記します。
pod 'Firebase/InAppMessagingDisplay'
その後、pod install
というコマンドを実行します。
installに成功した後は、AppDelegate.swiftでFirebaseApp.configure()
と記述します。これでアプリケーション側のセットアップは終了です。
Firebase コンソール
Firebase コンソールの左カラムの拡大(Growth)にあるIn-App Messagingをクリックします。
その後、最初のキャンペーンを作成
をクリックします。
次のような設定画面に遷移します。
次へを押すとスタイルと内容を設定した後はメッセージを表示するユーザーを設定します。
今回はテストのためアプリケーションをインストールしているユーザーすべてを対象にしたので潜在的ユーザーの100%がこのキャンペーンの対象になっています
というテキストが表示されています。
次へを押すとスケジュールの設定画面が表示されます。 メッセージが表示される期間の設定をまず行います。デフォルトでは終了日は指定されていないので指定した頻度で繰り返し表示されます。
また、Firebase Analyticsを使ってイベントをロギングしている場合はイベントをトリガーにメッセージを表示させることができます。Firebase Analyticsのロギングに関する記述は本筋とは関係がないので割愛しますが、今回のアプリケーションではアプリケーション起動時をイベントとして設定しています。
入力は任意になっていますが、インプレッション、クリック数にコンバージョンイベントを紐付けられます。今回は設定しません。
設定が済んだら公開を押して問題なければ終了です。
適切に設定が行えていたらダッシュボードに作成したキャンペーンが表示されています。
これでアプリケーションの起動時にメッセージが表示されるはずです。
表示されました。
テストメッセージの送信
Firebase In-App Messagingはメッセージの取得を1日に1回だけ行いますが、テストを行うためにメッセージをオンデマンドで表示するテストデバイスをFirebaseコンソールから指定できます。
Firebase アプリ内メッセージングを使ってみる | Firebaseによると、必要な情報はアプリのインスタンスID(FirebaseInstanceID
)です。
アプリケーションのインスタンスIDの取得
Xcodeプロジェクトを開いてメニューバーのProduct > Scheme > Edit Schemeの順に選択してダイアログのArgumentsタブを開きます。
Arguments Passed On Lanuch で +
ボタンをクリックしてフィールドに-FIRDebugEnabled
と入力してCloseを押します。
次のようになっていればOKです。
その後アプリケーションを実行すると[Firebase/InAppMessaging][I-IAM180017] Starting InAppMessaging runtime with Instance ID xxxxxxxxxxxxx
というログが出ているはずなのでこのIDをメモしておきます。
その後ダッシュボードからデバイスでテストを選択して表示されたポップアップで、インスタンスIDを追加してテストをクリックします。
テストデバイスにメッセージを送る
テストをクリックするとすぐにFirebaseアプリケーション内メッセージングからテスト用のメッセージが送信されます。表示するにはインスタンスIDを登録したデバイスでアプリケーションを閉じて再度開きます。
するとテストデバイスにメッセージが配信されるので表示の確認が行えます。
このテストデバイスにメッセージを配信する部分の手順はドキュメントに記載されています。
しかし、手順とおりにデバイスにメッセージを配信するためにアプリケーションを実行すると、[NSBundle initWithURL:]: nil URL argument'
というエラーを吐きクラッシュするというIssueが2つありました。もしクラッシュする場合は参考にしてみるとよいかもしれません。
- Missing InAppMessagingDisplayResources.bundle with Pod installation · Issue #3090 · firebase/firebase-ios-sdk
- In-App Messaging serious crash - [NSBundle initWithURL:]: nil URL argument · Issue #3558 · firebase/firebase-ios-sdk
特定のユーザーに配信する
マスクしていますが、今回はiOS版のアプリケーションをインストールしていて、あるUser Propertyの値がtrueだった場合のみ起動時に表示するように設定しました。
この場合、ユーザープロパティの設定が事前に必要になりますが、In-App Messaging固有の実装は不要です。
まとめ
In-App Messaging自体はアプリ側でほとんど実装が必要ない上に、制約はあるもののデザインのカスタマイズがある程度自由に行えるので大変便利でした。どのような属性のユーザーにどれぐらいのタイミングで表示するかという制御もコンソール上で済んでしまうのもメリットだと思います。
ユースケースの一つとして紹介されていますがアプリの新機能や新UIの紹介などに使うのも良さそうだと感じました。
最後になりますが、Firebaseの経験がまだまだ浅いので記述に誤りがあればご指摘いただけるとありがたいです。