プッシュ通知を受信する

🚧

画像などを添付したプッシュ通知に対応する場合

画像や動画などを添付したリッチプッシュ通知に対応するにはExtensionの作成が必要です。
詳しくは リッチプッシュ通知に対応する をご覧ください。

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

リモート通知機能は、KARTE SDKの導入及びKarteRemoteNotification モジュールを導入することで利用可能です。

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

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

導入手順

1. FCM SDK を導入する

  1. SDKを導入する
    導入に関しては、下記ドキュメントをご覧ください。
    Set up a Firebase Cloud Messaging client app on iOS

  2. Notification Composer で通知のテストを行う
    Firebase の Notification Composer から通知メッセージを送信し、メッセージが受信できるか確認してください。
    Send a notification message

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

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

3. KARTE SDK を導入する

  1. Podfile の編集
    プロジェクトディレクトリにある Podfile を任意のエディタで開き、KarteRemoteNotification の Pod を追加します。
pod 'KarteRemoteNotification'
  1. Pod のインストール
    プロジェクトディレクトで下記コマンドを実行し、Pod をインストールします。
pod install

実装手順

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

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

  1. SDKのインポート宣言を追加
    messaging(_:didReceiveRegistrationToken:) を実装しているファイルの先頭にインポート宣言を追加します。
import KarteRemoteNotification
@import KarteRemoteNotification;
  1. FCMトークンの送信処理を追加
    messaging(_:didReceiveRegistrationToken:) メソッド内に送信処理を追加します。
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
  // FCMトークンが生成/更新されたタイミングで、KARTE側にFCMトークンを登録
  KarteApp.registerFCMToken(fcmToken)
}
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken
{
  // FCMの登録トークンが生成/更新されたタイミングで、KARTE側に登録トークンを送信
  [KRTApp registerFCMToken:fcmToken];
}

[ 参考]FCM登録トークンや、アプリPUSH通知許可設定がKARTEに送信されるタイミング

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

受信したプッシュ通知をタップ(開封)した際、通知メッセージに含まれているリンクを開くためには下記の実装が必要となります。
※プッシュ通知のタップ時に、任意の画面に遷移させる等の処理をさせたい場合には必須の実装です。

なおクラスやメソッドの詳細は随時リファレンスを参照ください。
また通知タップ時にはmessage_clickイベントが自動で送信されます、送信されない場合はFAQ: 通知の開封を検知できませんを参照下さい。

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

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  let userInfo = response.notification.request.content.userInfo
  
  // KARTE経由のプッシュ通知であるか判定
  if let notification = RemoteNotification(userInfo: userInfo) {
    // KARTE経由のプッシュ通知のリンクを開く
    notification.handle()
  } else {
    // KARTE以外のシステムから送信されたプッシュ通知
  }
  completionHandler()
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;
  
  // KARTE経由のプッシュ通知であるか判定
  KRTRemoteNotification *notification = [[KRTRemoteNotification alloc] initWithUserInfo:userInfo];
  if (notification) {
    // KARTE経由のプッシュ通知のリンクを開く
    [notification handle];
  } else {
    // KARTE以外のシステムから送信されたプッシュ通知
  }
  completionHandler();
}

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

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  switch application.applicationState { 
    case .active, .inactive:
      // KARTE経由のプッシュ通知であるか判定
      if let notification = RemoteNotification(userInfo: userInfo) {
        // KARTE経由のプッシュ通知のリンクを開く
        notification.handle()
      } else {
        // KARTE以外のシステムから送信されたプッシュ通知
      }
    case .background:
      break
  }
  completionHandler(UIBackgroundFetchResult.newData)
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler
{
  switch (application.applicationState) {
    case UIApplicationStateActive:
    case UIApplicationStateInactive:
    {
      // KARTE経由のプッシュ通知であるか判定
      KRTRemoteNotification *notification = [[KRTRemoteNotification alloc] initWithUserInfo:[NSDictionary dictionary]];
      if (notification) {
        // KARTE経由のプッシュ通知のリンクを開く
        [notification handle];
      } else {
        // KARTE以外のシステムから送信されたプッシュ通知
      }
      break;
    }  
    case UIApplicationStateBackground:
      break;
  }
  completionHandler(UIBackgroundFetchResultNewData);
}

なお通知メッセージに含まれるURLを独自に処理したい場合は、RemoteNotification クラスの url プロパティを参照することで、URLのみを取り出すことが可能です。
その他の変数の取得についてはデフォルト変数とペイロード値の対応関係についてをご確認ください。

if let url = RemoteNotification(userInfo: userInfo)?.url {
  // KARTE経由のプッシュ通知かつURLが設定されている場合
  // URLに応じて独自にリンクを処理する
}
NSURL *url = [[[KRTRemoteNotification alloc] initWithUserInfo:userInfo] url];
if (url) {
  // KARTE経由のプッシュ通知かつURLが設定されている場合
  // URLに応じて独自にリンクを処理する
}

📘

Universal Links を利用してアプリ内に遷移させるには?

handle メソッドが内部で利用している、 UIApplication クラスの openURL メソッドは、Universal Links を適切に処理することができないため、そのままでは Safari が起動してしまいます。
そのため Universal Links をプッシュ通知に指定する場合は、アプリケーション側で通知クリック後の処理を実装する必要があります。
参考:Universal Links に対応する

動作確認

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

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

トラブルシューティング

プッシュ通知に問題がある場合は、KARTE for Appプッシュ通知で問題が発生した時のチェックリストを参考にしてください。


What’s Next

画像付きのプッシュ通知に対応する場合は、以下のドキュメントをご覧ください。