プッシュ通知を受信する

プッシュ通知を受信したい場合は、リモート通知機能を利用することで実現可能です。

リモート通知機能は、Karte.iOS.Notification もしくは Karte.Android.Notifications パッケージを導入することで利用可能です。

なお KARTE ではプッシュ通知の送信に、Firebase Cloud Messaging(以下FCM)を利用しています。
そのためFCM経由でプッシュ通知を送信するために各種設定を行う必要があります。

また受信側アプリケーションでも FCM SDK の導入が必要となります。

導入手順

1. FCM SDK を導入する

  1. SDKを導入する
    iOSは Xamarin.Firebase.iOS.CloudMessaging パッケージ、Androidは Xamarin.Firebase.Messaging パッケージを導入します。
    詳細な導入に関しては、下記ドキュメントをご覧ください。
  1. Notification Composer で通知のテストを行う
    Firebase の Notification Composer から通知メッセージを送信し、メッセージが受信できるか確認してください。

2. サービスアカウントの設定を行う

KARTEからFCMに対して通知の送信リクエストを行うために、KARTE側にサービスアカウントの設定を行う必要があります。
サービスアカウントを設定する

3. KARTE SDK を導入する

1. パッケージをインストールする

Visual Studio のサイドバーから Packages を右クリックし Manage NuGet Packages... をクリックします。検索バーに Karte を入力して Karte.iOS.Notification もしくは Karte.Android.Notifications パッケージをインストールしてください。

2. パッケージの初期化コードを追加する (iOSのみ)

次にアプリケーションにパッケージの初期化コードを追加します。

  1. usingディレクティブを追加
    UIApplicationDelegate を実装したクラスがあるファイル(通常はAppDelegate.cs)に using ディレクティブを追加します。
using Karte.iOS.Notification;
  1. パッケージの初期化コードを追加
    FinishedLaunching(UIApplication, NSDictionary) メソッド内に初期化コードを追加します。
[Export("application:didFinishLaunchingWithOptions:")]
public bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
	KRTApp.SetupWithAppKey("アプリケーションキー");
	...  
	KRTNotification.Configure();
	return true;
}

実装手順(iOS)

1. FCMトークンを送信する

KARTE からプッシュ通知を送信するためには、FCMトークンが必要となります。
そのためアプリケーションからKARTEにFCMトークンを送信する処理を実装します。

  1. SDKのインポート宣言を追加
    DidReceiveRemoteNotification(UIApplication, NSDictionary, Action<UIBackgroundFetchResult>) を実装しているファイルの先頭にusingディレクティブを追加します。
using Karte.iOS.Notification;
  1. FCMトークンの送信処理を追加
    DidReceiveRegistrationToken(Messaging, string) メソッド内に送信処理を追加します。
[Export("messaging:didReceiveRegistrationToken:")]
public void DidReceiveRegistrationToken(Messaging messaging, string fcmToken)
{
    KRTNotification.RegisterFCMToken(fcmToken);
}

2. 通知開封時の処理を実装する

受信したプッシュ通知をタップ(開封)した際、通知メッセージに含まれているリンクを開くためには下記の実装が必要となります。

Case1. UserNotifications.frameworkを利用するアプリケーションの場合

[Export("userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:")]
public void DidReceiveNotificationResponse(UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
{
    var userInfo = response.Notification.Request.Content.UserInfo;
    var notification = new KRTNotification(userInfo);

    // KARTE経由のプッシュ通知であるか判定
    if (notification != null)
    {
        // KARTE経由のプッシュ通知
        notification.HandleNotification();
    }
    else
    {
        // KARTE以外のシステムから送信されたプッシュ通知   
    }
    completionHandler();
}

Case2. UserNotifications.frameworkを利用しないまたはiOS10未満をサポートするアプリケーションの場合

[Export("application:didReceiveRemoteNotification:fetchCompletionHandler:")]
public void DidReceiveRemoteNotification(UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
{
    switch (application.ApplicationState)
    {
        case UIApplicationState.Active:
        case UIApplicationState.Inactive:
            // KARTE経由のプッシュ通知であるか判定
            var notification = new KRTNotification(userInfo);
            if (notification != null)
            {
                // KARTE経由のプッシュ通知
                notification.HandleNotification();
            }
            else
            {
                // KARTE以外のシステムから送信されたプッシュ通知   
            }
            break;
        case UIApplicationState.Background:
            break;
    }
    completionHandler(UIBackgroundFetchResult.NewData);
}

なお通知メッセージに含まれるURLを独自に処理したい場合は、KRTNotification クラスの Url プロパティを参照することで、URLのみを取り出すことが可能です。

var userInfo = response.Notification.Request.Content.UserInfo;
var notification = new KRTNotification(userInfo);
if (notification?.Url != null)
{
    // KARTE経由のプッシュ通知かつURLが設定されている場合
}

実装手順(Android)

1. FCMトークンを送信する

KARTE からプッシュ通知を送信するためには、FCMトークンが必要となります。
そのためアプリケーションからKARTEにFCMトークンを送信する処理を実装します。

FirebaseMessagingService クラスを継承したクラスを作成し、OnNewToken() メソッド内にトークンの送信処理を実装します。

using Firebase.Messaging;
using IO.Karte.Android.Notifications;

namespace Your.Namespace
{
    [Service(Label = "MyFirebaseMessagingService")]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        public override void OnNewToken(string token)
        {
            base.OnNewToken(token);
            Notifications.RegisterFCMToken(token);
        }
    }
}

📘

古い Xamarin.Firebase.Messaging パッケージを利用している場合

v17.1.0 未満の Xamarin.Firebase.Messaging パッケージ を利用してる場合は、代わりに FirebaseInstanceIdService を使い OnTokenRefresh()trackFcmToken() を呼び出してください。

また、KARTE SDK では FCM トークンを最新に保つために、アプリ起動時に自動で送信します。

2. 通知の表示処理を実装する

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

受信した通知を通知ドロワーに表示するために、FirebaseMessagingService クラスを継承したクラスの OnMessageReceived() メソッド内に、下記の実装を行う必要があります。

namespace Your.Namespace
{
    [Service(Label = "MyFirebaseMessagingService")]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        public override void OnMessageReceived(RemoteMessage remoteMessage)
        {
            base.OnMessageReceived(remoteMessage);
            var handled = MessageHandler.HandleMessage(this, remoteMessage);
            if (!handled) {
                // KARTE以外のシステムを起点に送信されたプッシュ通知の場合の処理を書く
            }
        }
    }
}

📘

通知タップ時のデフォルトの遷移先について

通知メッセージにディープリンクの指定がされていないもしくは不正なディープリンクが指定されていた場合は、デフォルトでアプリのTOP画面に遷移します。

デフォルトの遷移先を変更したい場合は、 MessageHandler.HandleMessage() の第3引数に Intent 指定することで変更することが可能です。

通知アイコン・アイコンカラーの設定

通知のアイコン・ラージアイコン・カスタムカラーを設定するには、AssemblyInfo.cs に下記を追加します。

// setSmallIcon に対応
[assembly: MetaData("io.karte.android.Tracker.notification_icon", Resource = "@drawable/ic_notification")]

// setLargeIcon に対応
[assembly: MetaData("io.karte.android.Tracker.notification_large_icon", Resource = "@drawable/ic_notification_large")]

// setColor に対応
[assembly: MetaData("io.karte.android.Tracker.notification_color", Resource = "@color/colorAccent")]

次に Resources/drawable 等に android:resource で指定したものに対応する画像ファイルを配置します。

🚧

通知アイコンのデフォルト画像について

notification_icon の設定を行わなかった場合、デフォルトではアプリのランチャーアイコンが挿入されます。
ただし、デフォルトのランチャーアイコンにアルファチャンネルが含まれない場合は、アイコンがグレーになってしまいます。

回避するには、アルファチャンネルを利用して描かれたアイコンを io.karte.android.Tracker.notification_icon に指定してもらうことで解決できます。

通知チャンネルの作成

通知テンプレート内でチャンネルの指定を行う場合は、あらかじめチャンネルを作成しておく必要があります。

var channel = new NotificationChannel("my_channel", "通知テストチャンネル",NotificationImportance.Default)
{
    Description = "テストの説明です"
};
channel.SetShowBadge(true);

// create or update the Notification channel
var notificationManager = (NotificationManager)GetSystemService(Android.Content.Context.NotificationService);
notificationManager.CreateNotificationChannel(channel);

📘

指定されたチャンネルが存在しない場合

通知テンプレートにて指定されたチャンネルが存在しない場合は、SDK 内で作成したデフォルトチャンネル (krt_default_channel) を指定して通知を行います。

動作確認

最後に正しく導入が行われているか確認を行うためにテストメッセージを送信して確認を行います。

詳細については、下記ドキュメントをご覧ください。
テストメッセージを送信する