クロスプラットフォームの Firebase Cloud Messaging クライアント アプリを C++ で作成するには、 Firebase Cloud Messaging API を使用します。 C++ SDK は、Android と Apple の両方のプラットフォームで動作しますが、プラットフォームごとに追加のセットアップが必要です。
Firebase と FCM SDK をセットアップする
アンドロイド
Firebase を C++ プロジェクトにまだ追加していない場合は追加します。
リンク先のセットアップ手順で、Firebase C++ SDK を使用するためのデバイスとアプリの要件を確認してください。これには、CMake を使用してアプリをビルドするための推奨事項が含まれます。
プロジェクト レベルの
build.gradle
ファイルで、buildscript
セクションとallprojects
セクションの両方に Google の Maven リポジトリを必ず含めてください。
Firebase アプリ オブジェクトを作成し、JNI 環境とアクティビティを渡します:
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 プロジェクトを構成します。
- Navigator 領域からプロジェクトを選択します。
- エディタ領域からプロジェクト ターゲットを選択します。
エディタ領域から [全般] タブを選択します。
- Linked Frameworks and Librariesまで下にスクロールし、 +ボタンをクリックしてフレームワークを追加します。
表示されるウィンドウで、 UserNotifications.frameworkまでスクロールし、そのエントリをクリックしてから、 Addをクリックします。
このフレームワークは、Xcode v8 以降でのみ表示され、このライブラリで必要とされます。
エディタ領域から [機能] タブを選択します。
- プッシュ通知をオンに切り替えます。
- Background Modesまで下にスクロールし、 Onに切り替えます。
- [バックグラウンド モード]で [リモート通知]を選択します。
Firebase アプリ オブジェクトを作成します:
app = ::firebase::App::Create(::firebase::AppOptions());
firebase::messaging::Listener
インターフェースを実装するクラスを定義します。Firebase Cloud Messaging を初期化し、アプリと構築されたリスナーを渡します:
::firebase::messaging::Initialize(app, listener);
デバイス登録トークンにアクセスする
Firebase Cloud Messaging ライブラリを初期化すると、クライアント アプリ インスタンスの登録トークンが要求されます。アプリは、 firebase firebase::messaging::Listener
を実装するクラスで定義する必要があるOnTokenReceived
コールバックでトークンを受け取ります。
その特定のデバイスをターゲットにする場合は、このトークンにアクセスする必要があります。
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 以降) は、 AndroidManifest.xml
ファイルに追加の変更を加える必要があるJobIntentService
を使用します。
<service android:name="com.google.firebase.messaging.MessageForwardingService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="false" > </service>
自動初期化を防ぐ
FCM は、デバイス ターゲティング用の登録トークンを生成します。トークンが生成されると、ライブラリは識別子と構成データを Firebase にアップロードします。トークンを使用する前に明示的なオプトインを取得する場合は、FCM (および Android では Analytics) を無効にすることで、構成時に生成を防ぐことができます。これを行うには、メタデータ値を Apple プラットフォームのInfo.plist
( GoogleService-Info.plist
ではありません)、または Android のAndroidManifest.xml
に追加します。
アンドロイド
<?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>
迅速
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 を使用してダウンストリーム メッセージとトピック メッセージを送信する準備が整います。詳細については、ダウンロード、実行、および確認できるクイックスタート サンプルで示されているこの機能を参照してください。
アプリにその他のより高度な動作を追加するには、アプリ サーバーからメッセージを送信するためのガイドを参照してください。
これらの機能を利用するには、サーバーの実装が必要になることに注意してください。