Unity を使用して Firebase Cloud Messaging クライアント アプリを設定する

クロスプラットフォーム対応の Firebase Cloud Messaging クライアント アプリを Unity で記述するには、Firebase Cloud Messaging API を使用します。Android と iOS それぞれに必要な設定を追加すれば、両方のプラットフォームで Unity SDK を動作させることができます。

準備

Firebase Cloud Messaging を使用するには、その前に Firebase プロジェクトを作成して、Firebase Unity SDK パッケージを Unity プロジェクトに追加する必要があります。

設定

前提条件

Android

iOS

  • Unity 5.0 以降
  • Xcode 8.0 以降
  • 物理 iOS 端末
  • プッシュ通知を有効にした APNs 証明書

Unity プロジェクトをまだ用意していない場合は、いずれかのクイックスタート サンプルをダウンロードし、特定の Firebase 機能をお試しいただけます。クイックスタートを使用する場合は、次のステップでバンドル識別子が必要になるため、プロジェクト設定からバンドル識別子を忘れずに取得してください。

Firebase コンソールでアプリを設定する

アプリに Firebase を追加するには、Firebase プロジェクトと、アプリ用の Firebase 設定ファイルが必要です。

Firebase プロジェクトをまだ用意していない場合は、Firebase コンソールで Firebase プロジェクトを作成します。モバイルアプリと関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。それ以外の場合は、[プロジェクトを追加] をクリックします。

Android

  1. [Android アプリに Firebase を追加] をクリックし、設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に行われることがあります。その場合は、設定ファイルをダウンロードするだけでかまいません。
  2. ダイアログが表示されたら、アプリのパッケージ名を入力してください。必ずアプリで使用しているパッケージ名を入力してください。パッケージ名を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
  3. 指示されたら google-services.json ファイルをダウンロードします。このファイルはいつでも再ダウンロードできます。
  4. このファイルを、プロジェクトのアセット フォルダ内の任意の場所にコピーします。

iOS

  1. [iOS アプリに Firebase を追加] をクリックし、設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に行われることがあります。その場合は、設定ファイルをダウンロードするだけでかまいません。
  2. ダイアログが表示されたら、アプリのバンドル ID を入力してください。必ずアプリで使用しているバンドル ID を入力してください。バンドル ID を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
  3. 指示されたら GoogleService-Info.plist ファイルをダウンロードします。このファイルはいつでも再ダウンロードできます。
  4. プロジェクトに GoogleService-Info.plist ファイルを追加します。

  5. Firebase コンソールからダウンロードした GoogleService-Info.plist を、Unity プロジェクトの任意のフォルダにドラッグします。

アプリに Firebase Unity SDK を追加する

  1. Firebase Unity SDK をダウンロードします。
  2. [Assets] > [Import Package] > [Custom Package] メニュー項目を選択します。
  3. 以前にダウンロードした Firebase Unity SDK から FirebaseMessaging.unitypackage パッケージをインポートします。
  4. [Import Unity Package] ウィンドウが表示されたら、[Import] ボタンをクリックします。

アプリをビルドする

Android

  1. [File] > [Build Settings] メニュー項目を選択します。
  2. [Platform] リストから [Android] を選択します。
  3. [Switch Platform] をクリックし、ターゲット プラットフォームとして [Android] を選択します。
  4. Unity ステータスバーの右下隅にあるスピナー(コンパイル中)アイコンが停止するまで待ちます。
  5. [Build and Run] をクリックします。

iOS

  1. [File] > [Build Settings] メニュー項目を選択します。
  2. [Platform] リストから [iOS] を選択します。
  3. [Switch Platform] をクリックし、ターゲット プラットフォームとして [iOS] を選択します。
  4. Unity ステータスバーの右下隅にあるスピナー(コンパイル中)アイコンが停止するまで待ちます。
  5. [Build and Run] をクリックします。

  6. Xcode が開いたら、UserNotifications.framework を追加します。

    1. Xcode でプロジェクトをクリックして、エディタ領域から [General] タブを選択します。
    2. [Linked Frameworks and Libraries] までスクロールし、+ ボタンをクリックしてフレームワークを追加します。
    3. 表示されたウィンドウで、UserNotifications.framework までスクロールし、その項目をクリックして [Add] をクリックします。

Firebase Cloud Messaging を初期化する

Firebase Cloud Message ライブラリは、TokenReceived または MessageReceived イベントのハンドラが追加されるときに初期化されます。

初期化時に、クライアント アプリ インスタンス用の登録トークンが要求されます。アプリは OnTokenReceived イベントでトークンを受け取ります。後で使用するためにこれをキャッシュしておく必要があります。このトークンは、この特定の端末をメッセージの対象にする場合に必要になります。

加えて、受信メッセージを受信可能にするには OnMessageReceived イベントに登録する必要があります。

セットアップ全体は次のようになります。

public void Start() {
  Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
  Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}

public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
  UnityEngine.Debug.Log("Received Registration Token: " + token.Token);
}

public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
  UnityEngine.Debug.Log("Received a new message from: " + e.Message.From);
}

Android エントリ ポイント アクティビティの設定

Android では、デフォルトの UnityPlayerActivity に代わるカスタム エントリ ポイント アクティビティが Firebase Cloud Messaging にバンドルされています。カスタム エントリ ポイントを使用していない場合、この置換は自動的に行われ、追加の操作を行う必要はありません。デフォルトのエントリ ポイント アクティビティを使用しないアプリや、独自の Assets/Plugins/AndroidManifest.xml を提供するアプリは、追加の設定が必要になります。

Android 上の Firebase Cloud Messaging Unity プラグインには、次の 2 つの追加のファイルがバンドルされています。

  • Assets/Plugins/Android/libmessaging_unity_player_activity.jar には、標準の UnityPlayerActivity を置き換える MessagingUnityPlayerActivity という名前のアクティビティが含まれています。
  • Assets/Plugins/Android/AndroidManifest.xml は、MessagingUnityPlayerActivity をアプリへのエントリ ポイントとして使用するようアプリに指示します。

これらのファイルが提供されている理由は、デフォルトの UnityPlayerActivityonStoponRestart アクティビティ ライフサイクル遷移を処理せず、受信メッセージを正しく処理するために Firebase Cloud Messaging で必要な onNewIntent を実装しないためです。

カスタム エントリ ポイント アクティビティの設定

アプリでデフォルトの UnityPlayerActivity を使用しない場合は、提供されている AndroidManifest.xml を削除して、カスタム アクティビティが Android アクティビティ ライフサイクルのすべての遷移を正しく処理できることを確認する必要があります(方法については、以下の例をご覧ください)。カスタム アクティビティが UnityPlayerActivity を拡張するものである場合は、代わりに、必要なすべてのメソッドを実装する com.google.firebase.MessagingUnityPlayerActivity を拡張できます。

カスタム アクティビティを使用していて、com.google.firebase.MessagingUnityPlayerActivity を拡張していない場合には、次のスニペットをアクティビティに入れる必要があります。

/**
 * Workaround for when a message is sent containing both a Data and Notification payload.
 *
 * When the app is in the background, if a message with both a data and notification payload is
 * receieved the data payload is stored on the Intent passed to onNewIntent. By default, that
 * intent does not get set as the Intent that started the app, so when the app comes back online
 * it doesn't see a new FCM message to respond to. As a workaround, we override onNewIntent so
 * that it sends the intent to the MessageForwardingService which forwards the message to the
 * FirebaseMessagingService which in turn sends the message to the application.
 */
@Override
protected void onNewIntent(Intent intent) {
  Intent message = new Intent(this, MessageForwardingService.class);
  message.setAction(MessageForwardingService.ACTION_REMOTE_INTENT);
  message.putExtras(intent);
  message.setData(intent.getData());
  startService(message);
}

/**
 * Dispose of the mUnityPlayer when restarting the app.
 *
 * This ensures that when the app starts up again it does not start with stale data.
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
  if (mUnityPlayer != null) {
    mUnityPlayer.quit();
    mUnityPlayer = null;
  }
  super.onCreate(savedInstanceState);
}

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

アプリがまったく実行されていないときにユーザーが通知をタップすると、デフォルトでは、メッセージが FCM の組み込みコールバックでルーティングされません。この場合、メッセージ ペイロードは、アプリの起動に使用される Intent を通じて受信されます。

アプリがバックグラウンドで動作しているときに受信したメッセージでは、通知項目の内容がシステムトレイ通知の入力に使用されますが、その通知内容は FCM に通知されません。つまり、FirebaseMessage.Notification は null になります。

要約:

アプリの状態 通知 データ 両方
フォアグラウンド Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived Firebase.Messaging.FirebaseMessaging.MessageReceived
バックグラウンド システムトレイ Firebase.Messaging.FirebaseMessaging.MessageReceived 通知: システムトレイ
インテントの追加部分にあるデータ

次のステップ

クライアント アプリを設定したら、Firebase でダウンストリーム メッセージやトピック メッセージを送信できる状態になります。詳細については、この機能を示すクイックスタート サンプルをご覧ください。

他のより高度な動作をアプリに追加するには、アプリサーバーからのメッセージ送信に関する次のガイドをご覧ください。

これらの機能を利用するには、サーバーの実装が必要です。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。