プッシュ通知を受信する

事前準備

事前に、KARTE SDKの導入を行う必要があります。

KARTE のプッシュ通知では、バックエンドとして Firebase Cloud Messaging (以下 FCM)を利用しています。
そのため、事前に FCM SDK を導入する必要があります。

FCM SDK を導入することで、FCM の登録トークンの取得が可能となり、KARTE から FCM を経由してプッシュ通知を送ることが可能になります。
なお KARTE から FCM を経由してプッシュ通知を送信するために、KARTE の管理画面側でもいくつかの設定が必要になります。

設定方法については、以下のドキュメントをご覧ください。

🚧

通知の表示と通知イベントの呼び出しについて

Firebase Unity SDKの仕様上、Android,iOSのネイティブ実装と挙動が違う部分があります。ご注意ください。

Android

アプリがバックグラウンド時に通知を受信した場合、通知イベント( Firebase.Messaging.FirebaseMessaging.MessageReceived )は呼ばれません。その後、アプリがフォアグラウンドになった時に通知イベントが呼ばれます。

また、アプリがバックグラウンド時に通知を表示するためには後述のServiceの設定が必要です。

iOS

アプリがフォアグラウンド時に通知を受信した場合、通知イベントは呼ばれますが、通知は表示されません。

通知の表示有無、通知イベントが呼ばれるタイミングについては以下の表をご参照ください。

Android

アプリの状態通知表示通知イベント
フォアグラウンド即時
バックグラウンド○(Serviceの設定が必要)アプリがフォアグラウンドになった時

iOS

アプリの状態通知表示通知イベント
フォアグラウンド×即時
バックグラウンドアプリがフォアグラウンドになった時

FCM SDK の導入を行う

FCM SDK の導入に関しては、下記ドキュメントをご覧ください。

Karte SDKをUnity Package Managerからインストールした場合

  1. https://developers.google.com/unity/archive からFirebase App(Core)Firebase Cloud Messagingの.tgzファイルをダウンロード
  2. ダウンロードしたファイルをプロジェクト内の適当なパスに配置
  3. Window > Package Managerから左上の+ボタンをクリックし、Add package from git tarball...を選択
  4. Firebase Appの.tgzを選択
  5. 同様の手順でFirebase Cloud Messagingも追加

Karte SDKをKarteSDK.unitypackageからインストールした場合

上記Firebaseのドキュメントの通りFirebase SDKを導入してください。

プッシュ通知の利用に必要な実装を行う

FCM トークンの送信

KARTE からプッシュ通知を送信するためには、アプリケーションから端末の登録トークンを送信する必要があります。

using UnityEngine;
using Io.Karte;
  
public class Sample : MonoBehaviour {
    private Firebase.FirebaseApp firebaseApp;
    
    void Start () {
        Firebase.FirebaseApp.CheckAndFixDependenciesAsync ().ContinueWith (task => {
                var dependencyStatus = task.Result;
                if (dependencyStatus == Firebase.DependencyStatus.Available) {
                    firebaseApp = Firebase.FirebaseApp.DefaultInstance;

                    Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
                    Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
                } else {
                    UnityEngine.Debug.LogError (System.String.Format ("Could not resolve all Firebase dependencies: {0}", dependencyStatus));
                }
            });
    }

    public void OnTokenReceived (object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
        App.RegisterFCMToken (token.Token);
    }
}

受信した通知メッセージのハンドリング

Unity側の実装

以下の処理を行うためには通知受信時にRemoteNotificationHandlerクラスの HandleRemoteNotificationメソッドを呼び出します。

  • iOS
    • 通知のディープリンクを開く
  • Android
    • 通知の表示
    • 通知開封イベントの送信
    • 通知のディープリンクを開く
using UnityEngine;
using Io.Karte;
  
public class Sample : MonoBehaviour {

    public void OnMessageReceived (object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
#if UNITY_IOS && !UNITY_EDITOR
            if (e.Message.NotificationOpened) {
                    //通知がタップされてアプリに遷移した
                    RemoteNotificationHandler.HandleRemoteNotification (e.Message.Data);
            } else {
                    //アプリがフォアグラウンド時に通知を受信した
            }
#elif UNITY_ANDROID && !UNITY_EDITOR
            RemoteNotificationHandler.HandleRemoteNotification (message.Data);
#endif
    }
}

📘

iOSのUnity側実装について

上記のiOS用の実装はディープリンクを開くためだけのものです。iOSでは通知の表示と通知の開封イベント送信は自動で行われます。そのため、ディープリンクの処理が必要ない場合は #if UNITY_IOS && !UNITY_EDITOR で囲われた部分は必要ありません。

📘

ディープリンク処理について

HandleRemoteNotificationで受け取ったディープリンクに対応する処理はアプリケーション側で実装が必要です。
詳細はUnityマニュアルのディープリンクを有効にするをご参照ください。

なお通知メッセージに含まれるディープリンクを独自に処理したい場合は、KarteRemoteNotificationHandlerクラスのRetrieveURLFromUserInfoメソッドを呼び出すことで、ディープリンクのみを取得し利用することが可能です。

string url = RemoteNotificationHandler.RetrieveURLFromUserInfo (e.Message.Data);

Androidのバックグラウンド状態で通知を受信する

Androidでバックグラウンドでも通知を受信するためにはlauncherのAndroidManifest.xmlに以下のようにServiceを追加してください。

<application android:label="@string/app_name" android:icon="@mipmap/app_icon" android:name="io.karte.unity.UnityApplication">
    <service android:name="io.karte.unity.UnityMessagingService"
        android:exported="false">
      <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
      </intent-filter>
    </service>
</application>

テストメッセージを送信する

テストメッセージの送信方法については、以下のドキュメントをご覧ください。