コンソールへ移動

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

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

始める前に

ステップ 1: 環境を設定する

  • Unity 5.3 以降をインストールします。

  • (iOS のみ)以下にアクセスできることを確認します。

    • Xcode 9.4.1 以降
    • CocoaPods 1.4.0 以降
  • Unity プロジェクトが適切な OS レベルをターゲットにしていることを確認します。

    • iOS の場合 - iOS 8 以降
    • Android の場合 - API レベル 16(Jelly Bean)以降
  • Unity プロジェクトを実行するためのデバイスまたはエミュレータを設定します。

    • iOS の場合 - Firebase Cloud Messaging を使用するために必要なもの:

      • 物理 iOS デバイス
      • プッシュ通知を有効にした APNs 証明書
    • Android の場合 - エミュレータでは Google Play のエミュレータ イメージを使用する必要があります。

  • Google アカウントを使用して Firebase にログインします。

Unity プロジェクトをまだ用意していない場合、Firebase プロダクトを試すだけであれば、クイックスタート サンプルをダウンロードしてご利用いただけます。

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

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

ステップ 3: Unity プロジェクトを Firebase プロジェクトに登録する

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

  1. Firebase コンソールの [Project Overview] ページの中央にある Unity アイコンをクリックして設定ワークフローを起動します。

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

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

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

    1. Unity プロジェクトを Unity IDE で開きます。

    2. [Build Settings] > [iOS] または [Android] > [Player Settings] > [Other Settings] に移動します。

      Unity プロジェクトの ID はバンドル ID の値です(ID の例: com.yourcompany.unity-project-name)。

    3. プラットフォーム固有の ID をそれぞれ該当する項目に入力します。

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

      • Android の場合 - Unity プロジェクトの Android ID を [Android パッケージ名] に入力します。

        • 「パッケージ名」と「アプリケーション ID」は、多くの場合、同じ意味に使用されます。
  4. (省略可)Unity プロジェクトのプラットフォーム固有のニックネームを入力します。

    これらのニックネームは内部用の簡便な ID であり、Firebase コンソールでのみ表示されます。

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

ステップ 4: Unity プロジェクトに Firebase 構成ファイルを追加する

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

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

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

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

    • 構成ファイルを移動する前に、構成ファイルに (2) のような文字が追加されていないことを確認してください。
    • Firebase 構成ファイルは Assets フォルダ内の任意の場所に置くことができます。
  3. Firebase コンソールの設定ワークフローに戻り、[次へ] をクリックします。

ステップ 5: Unity プロジェクトに Firebase SDK を追加する

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

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

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

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

  3. 解凍した SDK の中から Firebase Cloud Messaging SDK(FirebaseMessaging.unitypackage)を選択してインポートします。

    その他のサポートされている Firebase プロダクトもインポートできます。

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

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

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

Android 向け Firebase Unity SDK を使用するには、最新の Google Play 開発者サービスが必要です。

アプリケーションの先頭に次のコードを追加します。SDK で他のメソッドを呼び出す前に Google Play 開発者サービスを確認し、必要であれば、Firebase Unity SDK で必要とされるバージョンに更新します。

Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(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 を使用するように登録、構成されました。

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

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

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

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

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

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

これらのファイルが提供されている理由は、デフォルトの 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 通知: システムトレイ
インテントの追加部分にあるデータ

自動初期化を禁止する

FCM では FCM 内で登録トークンとして使用されるインスタンス ID も生成されます。インスタンス ID が生成されると、ライブラリによりその ID と構成データが Firebase にアップロードされます。インスタンス ID を使用する前に明示的にオプトインする場合は、構成時に FCM(Android ではアナリティクスも)を無効にして生成を禁止できます。この操作を iOS で行うには、メタデータ値を 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>

iOS

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

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

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