プッシュ通知を受信する

🚧

このドキュメントは古いバージョンのiOS SDK v1について記載しています

iOS SDK v1は 2021/05/11でサポート終了となります。
SDK v1 からのアップグレードについては、まず SDK v1からv2のアップグレード方法 をご覧ください。

事前準備

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

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

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

FCM SDK の導入を行う

FCM SDK の導入に関しては、下記ドキュメントの Firebase をiOS プロジェクトに追加する をご覧ください。

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

FCM トークンの送信

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

// Implement Firebase's MessagingDelegate
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
  
  // FCMの登録トークンが生成/更新されたタイミングで、KARTE側に登録トークンを送信
  KarteTracker.shared.registerFCMToken(fcmToken)
}
// Implement Firebase's FIRMessagingDelegate
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken
{
  // FCMの登録トークンが生成/更新されたタイミングで、KARTE側に登録トークンを送信  
  [[KarteTracker sharedTracker] registerFCMToken:fcmToken];
}

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

開封イベントを送信する

通知メッセージを開いた際の開封イベントの送信は、KARTE SDK が自動で行います。
そのため、アプリケーション側で開封イベントの送信処理を実装する必要はありません。

通知メッセージに含まれるディープリンクを開く

通知メッセージに含まれるディープリンクを開くには、KarteRemoteNotificationHandler クラスの handleRemoteNotification メソッドを呼び出します。
なおKARTE経由で送信されたメッセージであるか判別するには、同クラスの canHandleRemoteNotification メソッドを呼び出します。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  switch application.applicationState { 
    case .active, .inactive:
      // KARTE経由のプッシュ通知であるか判定
      if KarteRemoteNotificationHandler.canHandleRemoteNotification(userInfo) {
        // KARTE経由のプッシュ通知
        KarteRemoteNotificationHandler.handleRemoteNotification(userInfo)
      } else {
        // KARTE以外から送られたプッシュ通知
      }
    case .background:
      break
  }
  completionHandler(UIBackgroundFetchResult.newData)
}

// UNUserNotificationCenterDelegate (iOS10-) 
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
  let userInfo = response.notification.request.content.userInfo
  // KARTE経由のプッシュ通知であるか判定
  if KarteRemoteNotificationHandler.canHandleRemoteNotification(userInfo) {
    // KARTE経由のプッシュ通知
    KarteRemoteNotificationHandler.handleRemoteNotification(userInfo)
  } else {
    // KARTE以外から送られたプッシュ通知
  }
  completionHandler()
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler
{
  switch (application.applicationState) {
    case UIApplicationStateActive:
    case UIApplicationStateInactive:
      // KARTE経由のプッシュ通知であるか判定
      if ([KarteRemoteNotificationHandler canHandleRemoteNotification:userInfo]) {
        // KARTE経由のプッシュ通知
        [KarteRemoteNotificationHandler handleRemoteNotification:userInfo];
      } else {
        // KARTE以外から送られたプッシュ通知
      }
      break;
      
    case UIApplicationStateBackground:
      break;
  }
  completionHandler(UIBackgroundFetchResultNewData);
}

// UNUserNotificationCenterDelegate (iOS10-) 
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
API_AVAILABLE(ios(10.0)) {
  NSDictionary *userInfo = response.notification.request.content.userInfo;
  // KARTE経由のプッシュ通知であるか判定
  if ([KarteRemoteNotificationHandler canHandleRemoteNotification:userInfo]) {
    // KARTE経由のプッシュ通知
    [KarteRemoteNotificationHandler handleRemoteNotification:userInfo];
  } else {
    // KARTE以外から送られたプッシュ通知
  }
  completionHandler();
}

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

if let url = KarteRemoteNotificationHandler.retrieveURL(userInfo: userInfo) {
	// KARTE経由のプッシュ通知かつディープリンクが設定されている場合
}
NSURL *URL = [KarteRemoteNotificationHandler retrieveURLFromUserInfo:userInfo];
if (URL) {
  // KARTE経由のプッシュ通知かつディープリンクが設定されている場合
}

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

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