Unity でクロスプラットフォームの Firebase Cloud Messaging クライアント アプリを作成するには、 Firebase Cloud Messaging API を使用します。 Unity SDK は Android と Apple の両方で動作しますが、プラットフォームごとに追加の設定が必要です。
あなたが始める前に
前提条件
Unity 2019.1 以降をインストールします。以前のバージョンも互換性がある可能性がありますが、積極的にサポートされる予定はありません。 Unity 2019.1 のサポートは非推奨と見なされ、次のメジャー リリース以降は積極的にサポートされなくなります。
(Apple プラットフォームのみ)以下をインストールします。
- Xcode 13.3.1 以降
- CocoaPods 1.10.0 以降
Unity プロジェクトが次の要件を満たしていることを確認してください。
- iOS の場合— iOS 11 以降を対象としています
- tvOS の場合- tvOS 12 以降を対象
- Android の場合— API レベル 19 (KitKat) 以上を対象としています
デバイスをセットアップするか、エミュレーターを使用して Unity プロジェクトを実行します。
iOS または tvOSの場合 — アプリを実行する物理デバイスをセットアップし、次のタスクを完了します。
- Apple Developer アカウントの Apple プッシュ通知認証キーを取得します。
- XCode のApp > Capabilitiesでプッシュ通知を有効にします。
Androidの場合 —エミュレーターは、Google Play でエミュレーター イメージを使用する必要があります。
- Google アカウントを使用して Firebase にサインインします。
Unity プロジェクトをまだお持ちでなく、Firebase 製品を試してみたいだけの場合は、クイックスタート サンプルのいずれかをダウンロードできます。
ステップ 1: Firebase プロジェクトを作成する
Firebase を Unity プロジェクトに追加する前に、Firebase プロジェクトを作成して Unity プロジェクトに接続する必要があります。 Firebase プロジェクトについて詳しくは、 Firebase プロジェクトを理解するをご覧ください。
ステップ 2: アプリを Firebase に登録する
1 つ以上のアプリまたはゲームを登録して、Firebase プロジェクトに接続できます。
Firebase コンソールに移動します。
プロジェクト概要ページの中央にあるUnityアイコン (
) をクリックして、セットアップ ワークフローを起動します。Firebase プロジェクトに既にアプリを追加している場合は、[アプリを追加] をクリックしてプラットフォーム オプションを表示します。
登録する Unity プロジェクトのビルド ターゲットを選択するか、両方のターゲットを同時に登録することを選択することもできます。
Unity プロジェクトのプラットフォーム固有の ID を入力します。
iOSの場合 — Unity プロジェクトの iOS ID をiOS バンドル IDフィールドに入力します。
Androidの場合 — Android パッケージ名フィールドに Unity プロジェクトの Android ID を入力します。
パッケージ名とアプリケーション IDという用語は、しばしば同じ意味で使用されます。
Unity IDE で Unity プロジェクトを開き、各プラットフォームの設定セクションに移動します。
iOS の場合— Build Settings > iOSに移動します。
Android の場合— [Android] > [Player Settings] > [Other Settings]に移動します。
Unity プロジェクトの ID はBundle Identifierの値です (ID の例:
com.yourcompany.yourproject
)。(オプション) Unity プロジェクトのプラットフォーム固有のニックネームを入力します。
これらのニックネームは内部の便利な識別子であり、Firebase コンソールでのみ表示されます。[アプリを登録]をクリックします。
ステップ 3: Firebase 構成ファイルを追加する
Firebase コンソールのセットアップ ワークフローで、プラットフォーム固有の Firebase 構成ファイルを取得します。
iOS の場合— [ GoogleService-Info.plist をダウンロード] をクリックします。
Android の場合— [ google-services.json をダウンロード] をクリックします。
Firebase 構成ファイルには、プロジェクトの一意であるが秘密ではない識別子が含まれています。この構成ファイルの詳細については、 Firebase プロジェクトを理解するをご覧ください。
Firebase 構成ファイルはいつでも再ダウンロードできます。
構成ファイル名に
(2)
のような追加の文字が追加されていないことを確認してください。
Unity プロジェクトのProjectウィンドウを開き、構成ファイルを
Assets
フォルダーに移動します。Firebase コンソールに戻り、セットアップ ワークフローで [次へ] をクリックします。
ステップ 4: Firebase Unity SDK を追加する
Firebase コンソールで、 Download Firebase Unity SDKをクリックし、SDK を適切な場所に解凍します。
Firebase Unity SDKはいつでも再ダウンロードできます。
Firebase Unity SDK はプラットフォーム固有ではありません。
開いている Unity プロジェクトで、 Assets > Import Package > Custom Packageに移動します。
解凍した SDK から、アプリで使用するサポート対象の Firebase プロダクトを選択します。
Firebase Cloud Messaging で最適なエクスペリエンスを得るには、プロジェクトでGoogle アナリティクスを有効にすることをお勧めします。また、Analytics の設定の一環として、Analytics 用の Firebase パッケージをアプリに追加する必要があります。
分析が有効
- Google アナリティクス用の Firebase パッケージを追加します:
FirebaseAnalytics.unitypackage
- Firebase Cloud Messaging のパッケージを追加します:
FirebaseMessaging.unitypackage
分析が有効になっていません
Firebase Cloud Messaging のパッケージを追加します:
FirebaseMessaging.unitypackage
- Google アナリティクス用の Firebase パッケージを追加します:
[ Unity パッケージのインポート] ウィンドウで、[インポート] をクリックします。
Firebase コンソールに戻り、セットアップ ワークフローで [次へ] をクリックします。
ステップ 5: Google Play サービスのバージョン要件を確認する
Firebase Unity SDK for Android にはGoogle Play サービスが必要です。これは、SDK を使用する前に最新である必要があります。
アプリケーションの先頭に次のコードを追加します。 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: ユーザー通知フレームワークを追加する
Xcode でプロジェクトをクリックし、エディタ領域から [全般] タブを選択します。
Linked Frameworks and Librariesまで下にスクロールし、 +ボタンをクリックしてフレームワークを追加します。
表示されるウィンドウで、 UserNotifications.frameworkまでスクロールし、そのエントリをクリックしてから、 Add をクリックします。
ステップ 8: プッシュ通知を有効にする
Xcode でプロジェクトをクリックし、エディタ領域から [機能] タブを選択します。
プッシュ通知をオンに切り替えます。
Background Modesまで下にスクロールし、 Onに切り替えます。
[バックグラウンド モード] の下の [リモート通知] チェックボックスをオンにします。
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
がonStop
、 onRestart
アクティビティのライフサイクル遷移を処理しないか、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 以降) は、 AndroidManifest.xml
ファイルに追加の変更を加える必要があるJobIntentService
を使用します。
<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 は、デバイス ターゲティング用の登録トークンを生成します。トークンが生成されると、ライブラリは識別子と構成データを 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.FirebaseMessaging.TokenRegistrationOnInitEnabled = 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 を使用してダウンストリーム メッセージとトピック メッセージを送信する準備が整いました。詳細については、この機能を示すクイックスタート サンプルを参照してください。
アプリにその他のより高度な動作を追加するには、アプリ サーバーからメッセージを送信するためのガイドを参照してください。
これらの機能を利用するには、サーバーの実装が必要になることに注意してください。