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

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

始める前に

前提条件

  • Unity 2021 LTS 以降をインストールします。Unity 2020 のサポートは非推奨とみなされており、次のメジャー リリース以後は積極的にサポートされなくなります。これより前のバージョンも互換性がある可能性がありますが、積極的にはサポートされません。

  • (Apple プラットフォームのみ)以下をインストールします。

    • Xcode 13.3.1 以降
    • CocoaPods 1.12.0 以降
  • Unity プロジェクトが次の要件を満たしていることを確認します。

    • iOS の場合 - ターゲットが iOS 13 以降であること
    • tvOS の場合 - ターゲットが tvOS 13 以降であること
    • Android の場合 - ターゲットが API レベル 21(Lollipop)以降であること
  • デバイスを設定するか、エミュレータを使用して Unity プロジェクトを実行します。

    • iOS または tvOS の場合 - 実機を設定してアプリを実行するか、次の作業を行います。

      • Apple Developer アカウントの Apple Push Notification Authentication Key を取得します。
      • プッシュ通知を XCode の [App] > [Capabilities] で有効にします。
    • Android の場合 - エミュレータでは Google Play のエミュレータ イメージを使用する必要があります。

Unity プロジェクトがまだない方で Firebase プロダクトを試してみたい場合は、クイックスタート サンプルをダウンロードしてください。

ステップ 1: Firebase プロジェクトを作成する

Unity プロジェクトに Firebase を追加する前に、Unity プロジェクトに接続するための Firebase プロジェクトを作成する必要があります。Firebase プロジェクトの詳細については、Firebase プロジェクトについて理解するをご覧ください。

ステップ 2: アプリを Firebase に登録する

Firebase プロジェクトに接続するアプリやゲームを登録できます。

  1. Firebaseコンソールに移動します。

  2. プロジェクトの概要ページの中央で、Unity アイコン()をクリックして設定ワークフローを起動します。

    すでに Firebase プロジェクトにアプリを追加している場合は、[アプリを追加] をクリックするとプラットフォームのオプションが表示されます。

  3. 登録する Unity プロジェクトのビルド ターゲットを選択するか、両方のターゲットを同時に登録することもできます。

  4. Unity プロジェクトのプラットフォーム固有の ID を入力します。

    • iOS の場合 - Unity プロジェクトの iOS ID を [iOS バンドル ID] に入力します。

    • Android の場合 - Unity プロジェクトの Android ID を [Android パッケージ名] に入力します。「パッケージ名」と「アプリケーション ID」は、しばしば同じ意味で使用されます。

  5. (省略可)Unity プロジェクトのプラットフォーム固有のニックネームを入力します。
    これらのニックネームは内部用の便宜的な ID であり、Firebase コンソールにのみ表示されます。

  6. [アプリの登録] をクリックします。

ステップ 3: Firebase 構成ファイルを追加する

  1. Firebase コンソールの設定ワークフローでプラットフォーム固有の Firebase 構成ファイルを取得します。

    • iOS の場合 - [GoogleService-Info.plist をダウンロード] をクリックします。

    • Android の場合 - [google-services.json をダウンロード] をクリックします。

  2. Unity プロジェクトで [Project] ウィンドウを開き、構成ファイルを Assets フォルダに移動します。

  3. Firebase コンソールの設定ワークフローに戻り、[次へ] をクリックします。

ステップ 4:Firebase Unity SDK を追加する

  1. Firebase コンソールで [Firebase Unity SDK をダウンロード] をクリックし、適切な場所で SDK を解凍します。

    • Firebase Unity SDK はいつでも再ダウンロードできます。

    • Firebase Unity SDK はプラットフォーム固有ではありません。

  2. 開いている Unity プロジェクトで、[Assets] > [Import Package] > [Custom Package] を選択します。

  3. 解凍した SDK から、アプリで使用するサポートされている Firebase プロダクトを選択します。

    Firebase Cloud Messaging のエクスペリエンスを最適化するために、プロジェクトで Google Analytics を有効にすることをおすすめします。また、Analytics を設定する際に、Analytics 用の Firebase パッケージをアプリに追加する必要があります。

    Analytics 有効化

    • Google Analytics の Firebase パッケージを追加します。FirebaseAnalytics.unitypackage
    • Firebase Cloud Messaging のパッケージを追加します。FirebaseMessaging.unitypackage

    Analytics 無効

    Firebase Cloud Messaging のパッケージを追加します。FirebaseMessaging.unitypackage

  4. [Import Unity Package] ウィンドウで [Import] をクリックします。

  5. Firebase コンソールの設定ワークフローに戻り、[次へ] をクリックします。

ステップ 5: Google Play 開発者サービスの要件を確認する

Android 向け Firebase Unity SDK を使用するには、Google Play services が必要です。SDK を使用するには、これが最新バージョンであることが必要です。

アプリケーションの先頭に次の using ステートメントと初期化コードを追加します。SDK で他のメソッドを呼び出す前に Google Play services を確認し、必要に応じて Firebase Unity SDK で必要とされるバージョンに更新します。

using Firebase.Extensions;
Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
  var dependencyStatus = task.Result;
  if (dependencyStatus == Firebase.DependencyStatus.Available) {
    // Create and hold a reference to your FirebaseApp,
    // where app is a Firebase.FirebaseApp property of your application class.
       app = Firebase.FirebaseApp.DefaultInstance;

    // Set a flag here to indicate whether Firebase is ready to use by your app.
  } else {
    UnityEngine.Debug.LogError(System.String.Format(
      "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
    // Firebase Unity SDK is not safe to use here.
  }
});

Unity プロジェクトは Firebase を使用するように登録、構成されました。

Apple サポート用の APN 認証キーをアップロードする

APNs 認証キーを Firebase にアップロードします。まだ APNs 認証キーを用意していない場合は、Apple Developer Member Center で作成してください。

  1. Firebase コンソールのプロジェクト内で歯車アイコンを選択し、[プロジェクトの設定]、[Cloud Messaging] タブの順に選択します。

  2. [iOS アプリの構成] の下の [APNs 認証キー] で [アップロード] ボタンをクリックします。

  3. キーを保存した場所に移動し、キーを選択して [開く] をクリックします。キーのキー ID(Apple Developer Member Center で確認できます)を追加し、[アップロード] をクリックします。

Apple プラットフォームでプッシュ通知を有効にする

ステップ 1: ユーザー通知フレームワークを追加する

  1. Xcode でプロジェクトをクリックし、編集領域で [General] タブを選択します。

  2. [Linked Frameworks and Libraries] が表示されるまで下にスクロールし、[+] ボタンをクリックしてフレームワークを追加します。

  3. 表示されたウィンドウで UserNotifications.framework までスクロールし、そのエントリをクリックしてから [Add] をクリックします。

ステップ 2: プッシュ通知を有効にする

  1. Xcode でプロジェクトをクリックし、編集領域で [Capabilities] タブを選択します。

  2. [Push Notifications] を [On] に切り替えます。

  3. [Background Modes] までスクロールして、[On] に切り替えます。

  4. [Background Modes] の下の [Remote notifications] チェックボックスをオンにします。

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 をアプリへのエントリ ポイントとして使用するようアプリに指示します。

これらのファイルは、デフォルトの UnityPlayerActivity により onStoponRestart のアクティビティのライフサイクルの遷移が処理されていないか、または 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
 * received 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());
  // For older versions of Firebase C++ SDK (< 7.1.0), use `startService`.
  // startService(message);
  MessageForwardingService.enqueueWork(this, 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);
}

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>

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

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

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

まとめると、次のとおりです。

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

自動初期化を禁止する

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.FirebaseMessaging.TokenRegistrationOnInitEnabled = 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 でダウンストリーム メッセージやトピック メッセージを送信できる状態になります。詳細については、この機能のクイックスタート サンプルをご覧ください。

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

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