クロスプラットフォーム対応の Firebase Cloud Messaging クライアント アプリを C++ で記述するには、Firebase Cloud Messaging API を使用します。Android と Apple プラットフォームそれぞれに必要な設定を追加すれば、両方のプラットフォームで C++ SDK を動作させることができます。
Firebase と FCM SDK を設定する
Android
まだ追加していない場合は、Firebase を C++ プロジェクトに追加します。
このリンク先のセットアップ手順では、Firebase C++ SDK を使用する場合のデバイスとアプリの要件(CMake を使用してアプリをビルドする場合の推奨事項など)を確認してください。
プロジェクト レベルの
build.gradle
ファイルのbuildscript
セクションとallprojects
セクションの両方に Google の Maven リポジトリを組み込みます。
JNI 環境とアクティビティを引数で渡し、Firebase App オブジェクトを作成します。
app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);
firebase::messaging::Listener
インターフェースを実装するクラスを定義します。アプリと構築済みリスナーを引数で渡し、FCM を初期化します。
::firebase::messaging::Initialize(app, listener);
Google Play 開発者サービスの SDK に依存するアプリについては、機能にアクセスする前に必ず、互換性のある Google Play 開発者サービスの APK がデバイスにインストールされているかチェックしてください。詳しくは、Google Play 開発者サービスの APK のチェック手順をご覧ください。
iOS+
- 有効な APNs 証明書が必要です。まだお持ちでない場合は、Apple Developer Member Center で作成してください。
- まだ追加していない場合は、Firebase を C++ プロジェクトに追加します。続いて、FCM 用にプロジェクトを設定します。
- プロジェクトの Podfile に FCM の依存関係を追加します。
pod 'FirebaseMessaging'
- フレームワーク
firebase.framework
とfirebase_messaging.framework
を Firebase C++ SDK から Xcode プロジェクトにドラッグします。
- プロジェクトの Podfile に FCM の依存関係を追加します。
プッシュ通知を有効にするように、Xcode プロジェクトを構成します。
- ナビゲータ領域からプロジェクトを選択します。
- エディタ領域からプロジェクト ターゲットを選択します。
エディタ領域から [General] タブを選択します。
- [Linked Frameworks and Libraries] までスクロールし、[+] ボタンをクリックしてフレームワークを追加します。
表示されたウィンドウで、[UserNotifications.framework] までスクロールし、その項目をクリックして [Add] をクリックします。
このフレームワークは、Xcode v8 以降でのみ表示され、このライブラリで必須となっています。
エディタ領域から [Capabilities] タブを選択します。
- [Push Notifications] を [On] に切り替えます。
- [Background Modes] までスクロールして、[On] に切り替えます。
- [Background Modes] で [Remote notifications] を選択します。
Firebase アプリ オブジェクトを作成します。
app = ::firebase::App::Create(::firebase::AppOptions());
firebase::messaging::Listener
インターフェースを実装するクラスを定義します。アプリと構築済みリスナーを引数で渡し、Firebase Cloud Messaging を初期化します。
::firebase::messaging::Initialize(app, listener);
デバイス登録トークンにアクセスする
Firebase Cloud Messaging ライブラリの初期化の際に、クライアント アプリのインスタンス用に登録トークンがリクエストされます。アプリは OnTokenReceived
コールバックで登録トークンを受け取ります。このトークンは firebase::messaging::Listener
を実装するクラスで定義される必要があります。
その特定のデバイスをターゲットにする場合は、このトークンにアクセスする必要があります。
Android でのメッセージ配信に関する注意点
アプリがまったく実行されていないときにユーザーが通知をタップすると、デフォルトでは、メッセージが FCM の組み込みコールバックでルーティングされません。この場合、メッセージ ペイロードは、アプリの起動に使用される Intent
を通じて受信されます。FCM がこれらの受信メッセージを C++ ライブラリのコールバックに転送するようにするには、Activity の onNewIntent
メソッドをオーバーライドし、Intent
を MessageForwardingService
に渡す必要があります。
import com.google.firebase.messaging.MessageForwardingService; class MyActivity extends Activity { private static final String TAG = "MyActvity"; @Override protected void onNewIntent(Intent intent) { Log.d(TAG, "A message was sent to this app while it was in the background."); Intent message = new Intent(this, MessageForwardingService.class); message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT); message.putExtras(intent); message.setData(intent.getData()); // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`. // startService(message); MessageForwardingService.enqueueWork(this, message); } }
アプリがバックグラウンドで動作しているときに受信したメッセージでは、通知フィールドの内容がシステムトレイ通知の入力に使用されますが、その通知内容は FCM に伝達されません。つまり、Message::notification
は null になります。
要約:
アプリの状態 | 通知 | データ | 両方 |
---|---|---|---|
フォアグラウンド | OnMessageReceived |
OnMessageReceived |
OnMessageReceived |
バックグラウンド | システムトレイ | OnMessageReceived |
通知: システムトレイ データ: インテントの追加部分内 |
Android でのカスタム メッセージ処理
アプリに送信される通知はデフォルトで ::firebase::messaging::Listener::OnMessageReceived
に渡されますが、場合によってはデフォルトの動作をオーバーライドすることもできます。Android でこれを行うには、com.google.firebase.messaging.cpp.ListenerService
を拡張するカスタムクラスを作成し、プロジェクトの AndroidManifest.xml
を更新する必要があります。
ListenerService
メソッドをオーバーライドします。
ListenerService
は、アプリに送信された受信メッセージを傍受し、C++ ライブラリにルーティングする Java クラスです。アプリがフォアグラウンドにあるとき(またはアプリがバックグラウンドで、データのみのペイロードを受け取るとき)、メッセージはこのクラスで提供されるコールバックの 1 つを通過します。メッセージ処理にカスタム動作を追加するには、FCM のデフォルトの ListenerService
を拡張する必要があります。
import com.google.firebase.messaging.cpp.ListenerService; class MyListenerService extends ListenerService {
ListenerService.onMessageReceived
メソッドをオーバーライドすると、受信した RemoteMessage オブジェクトに基づいて操作を行い、メッセージ データを取得できます。
@Override public void onMessageReceived(RemoteMessage message) { Log.d(TAG, "A message has been received."); // Do additional logic... super.onMessageReceived(message); }
ListenerService
には、それほど頻繁に使用されない他のいくつかのメソッドもあります。これらはオーバーライドすることもできます。詳しくは、FirebaseMessagingService のリファレンスをご覧ください。
@Override public void onDeletedMessages() { Log.d(TAG, "Messages have been deleted on the server."); // Do additional logic... super.onDeletedMessages(); } @Override public void onMessageSent(String messageId) { Log.d(TAG, "An outgoing message has been sent."); // Do additional logic... super.onMessageSent(messageId); } @Override public void onSendError(String messageId, Exception exception) { Log.d(TAG, "An outgoing message encountered an error."); // Do additional logic... super.onSendError(messageId, exception); }
AndroidManifest.xml
の更新
カスタムクラスを作成したら、AndroidManifest.xml
に含めて有効にする必要があります。以下の例のように、<manifest>
タグ内に適切な属性を宣言することによって、マニフェストにマージツールが含まれるようにします。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.google.firebase.messaging.cpp.samples" xmlns:tools="http://schemas.android.com/tools">
firebase_messaging_cpp.aar
アーカイブには、FCM のデフォルトの ListenerService
を宣言する AndroidManifest.xml
ファイルがあります。このマニフェストは通常、ListenerService
の実行方法であるプロジェクト固有のマニフェストとマージされます。この ListenerService
は、カスタム リスナー サービスで置き換える必要があります。そのためには、デフォルトの ListenerService
を削除してカスタム サービスを追加します。カスタム サービスを追加するには、プロジェクトの AndroidManifest.xml
ファイルに以下の行を追加します。
<service android:name="com.google.firebase.messaging.cpp.ListenerService" tools:node="remove" />
<service android:name="com.google.firebase.messaging.cpp.samples.MyListenerService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
Firebase C++ SDK の新しいバージョン(7.1.0 以降)では JobIntentService
が使用されるため、AndroidManifest.xml
ファイルで追加の変更を行う必要があります。
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
自動初期化を禁止する
FCM はモバイル デバイス ターゲティング用の登録トークンを生成します。トークンが生成されると、ライブラリによってその ID と構成データが Firebase にアップロードされます。トークンを使用する前に明示的にオプトインする場合は、構成時に FCM(Android ではアナリティクス)を無効にして生成を禁止できます。この操作を Apple プラットフォームで行うには、メタデータ値を Info.plist
に追加します(GoogleService-Info.plist
ではありません)。Android で行う場合は、メタデータ値を AndroidManifest.xml
に追加します。
Android
<?xml version="1.0" encoding="utf-8"?> <application> <meta-data android:name="firebase_messaging_auto_init_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" /> </application>
Swift
FirebaseMessagingAutoInitEnabled = NO
FCM をもう一度有効にするには、ランタイム コールを実行します。
::firebase::messaging::SetTokenRegistrationOnInitEnabled(true);
この値をいったん設定すると、アプリを再起動しても維持されます。
Android でディープリンクを含むメッセージを処理する
FCM では、ディープリンクを含むメッセージをアプリに送信できます。ディープリンクを含むメッセージを受信するには、アプリのディープリンクを処理するアクティビティに新しいインテント フィルタを追加する必要があります。インテント フィルタは、ドメインのディープリンクをキャッチする必要があります。メッセージにディープリンクが含まれていない場合は、この構成を行う必要はありません。AndroidManifest.xml では次のように追加します。
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="http"/> <data android:host="CHANGE_THIS_DOMAIN.example.com" android:scheme="https"/> </intent-filter>
ワイルドカードを指定すると、インテント フィルタをより柔軟に設定できます。次に例を示します。
<intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:host="*.example.com" android:scheme="http"/> <data android:host="*.example.com" android:scheme="https"/> </intent-filter>
指定したスキームとホストへのリンクを含む通知がタップされると、アプリがこのインテント フィルタを含むアクティビティを開始し、リンクを処理します。
次のステップ
クライアント アプリを設定したら、Firebase でダウンストリーム メッセージやトピック メッセージを送信できる状態になります。詳細については、ダウンロードして実行可能なクイックスタート サンプルでこの機能に関するデモをご確認ください。
別のより高度な動作をアプリに追加するには、アプリサーバーからのメッセージの送信に関するガイドをご覧ください。
これらの機能を利用するには、サーバーの実装が必要です。