Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

C ++でFirebaseCloudMessagingクライアントアプリを設定する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

クロスプラットフォームの Firebase Cloud Messaging クライアント アプリを C++ で作成するには、 Firebase Cloud Messaging API を使用します。 C++ SDK は、Android と Apple の両方のプラットフォームで動作しますが、プラットフォームごとに追加のセットアップが必要です。

Firebase と FCM SDK をセットアップする

アンドロイド

  1. Firebase を C++ プロジェクトにまだ追加していない場合は追加します。

    • リンク先のセットアップ手順で、Firebase C++ SDK を使用するためのデバイスとアプリの要件を確認してください。これには、CMake を使用してアプリをビルドするための推奨事項が含まれます。

    • プロジェクト レベルのbuild.gradleファイルで、 buildscriptセクションとallprojectsセクションの両方に Google の Maven リポジトリを必ず含めてください。

  2. Firebase アプリ オブジェクトを作成し、JNI 環境とアクティビティを渡します:

    app = ::firebase::App::Create(::firebase::AppOptions(), jni_env, activity);

  3. firebase::messaging::Listenerインターフェースを実装するクラスを定義します。

  4. FCM を初期化し、アプリと構築されたリスナーを渡します:

    ::firebase::messaging::Initialize(app, listener);

  5. Google Play サービス SDK に依存するアプリは、機能にアクセスする前に、互換性のある Google Play サービス APK についてデバイスを確認する必要があります。詳細については、Google Play サービスの APK を確認する を参照してください。

iOS+

  1. 有効なAPNs証明書が必要です。まだお持ちでない場合は、 Apple Developer Member Centerで必ず作成してください。
  2. Firebase を C++ プロジェクトにまだ追加していない場合は追加します。次に、FCM 用にプロジェクトを設定するには:
    1. プロジェクトの Podfile で、FCM 依存関係を追加します:
      pod 'FirebaseMessaging'
    2. firebase.frameworkおよびfirebase_messaging.frameworkフレームワークをFirebase C++ SDKから Xcode プロジェクトにドラッグします。
  3. プッシュ通知を有効にするように Xcode プロジェクトを構成します。

    1. Navigator 領域からプロジェクトを選択します。
    2. エディタ領域からプロジェクト ターゲットを選択します。
    3. エディタ領域から [全般] タブを選択します。

      1. Linked Frameworks and Librariesまで下にスクロールし、 +ボタンをクリックしてフレームワークを追加します。
      2. 表示されるウィンドウで、 UserNotifications.frameworkまでスクロールし、そのエントリをクリックしてから、 Addをクリックします。

        このフレームワークは、Xcode v8 以降でのみ表示され、このライブラリで必要とされます。

    4. エディタ領域から [機能] タブを選択します。

      1. プッシュ通知オンに切り替えます。
      2. Background Modesまで下にスクロールし、 Onに切り替えます。
      3. [バックグラウンド モード]で [リモート通知]を選択します。
  4. Firebase アプリ オブジェクトを作成します:

    app = ::firebase::App::Create(::firebase::AppOptions());

  5. firebase::messaging::Listenerインターフェースを実装するクラスを定義します。

  6. Firebase Cloud Messaging を初期化し、アプリと構築されたリスナーを渡します:

    ::firebase::messaging::Initialize(app, listener);

デバイス登録トークンにアクセスする

Firebase Cloud Messaging ライブラリを初期化すると、クライアント アプリ インスタンスの登録トークンが要求されます。アプリは、 firebase firebase::messaging::Listenerを実装するクラスで定義する必要があるOnTokenReceivedコールバックでトークンを受け取ります。

その特定のデバイスをターゲットにする場合は、このトークンにアクセスする必要があります。

Android でのメッセージ配信に関する注意事項

アプリがまったく実行されていないときにユーザーが通知をタップすると、デフォルトでは、メッセージは FCM の組み込みコールバックを介してルーティングされません。この場合、メッセージ ペイロードは、アプリケーションの起動に使用されるIntentを介して受信されます。 FCM がこれらの受信メッセージを C++ ライブラリ コールバックに転送するようにするには、Activity でメソッドonNewIntentをオーバーライドし、 IntentMessageForwardingServiceに渡す必要があります。

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);

この値は、一度設定するとアプリを再起動しても保持されます。

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 を使用してダウンストリーム メッセージとトピック メッセージを送信する準備が整います。詳細については、ダウンロード、実行、および確認できるクイックスタート サンプルで示されているこの機能を参照してください。

アプリにその他のより高度な動作を追加するには、アプリ サーバーからメッセージを送信するためのガイドを参照してください。

これらの機能を利用するには、サーバーの実装が必要になることに注意してください。