通知の開封を検知できません

🚧

ここでは iOS 固有の事象について取り扱っております

KARTE SDK では通知を開封した際、通知の効果測定を行うために自動で 接客サービスのクリック イベントを送信しています。
通知の開封を検知するために UNUserNotificationDelegate に対して Method Swizzling を行っておりますが、アプリの実装方法や同時に導入するSDKの組み合わせによっては、UNUserNotificationDelegateのメソッドが呼び出されなくなる場合があります。

これは KARTE SDK で実装している Method Swizzling の処理と、他のSDK等で実装している Method Swizzling の処理がコンフリクトしているために発生することが多いです。

これを回避するために KARTE SDK では Method Swizzling を無効にする機能を用意しております。

Method Swizzling を無効にする方法

下記実装を行うことで、Method Swizzling を無効にすることができます。

RemoteNotification.isEnabledAutoMeasurement = false
[KRTRemoteNotification setIsEnabledAutoMeasurement:NO];

🚧

注意事項

Method Swizzling を無効にする設定は、KarteApp.setup(appKey:) を呼び出す前に行う必要があります。KarteApp.setup(appKey:) 以降で設定を行っても Method Swizzling は無効になりません。

🚧

制限事項

この機能は KARTE RemoteNotification SDK v2.4.0 から対応しています。

手動でのクリックイベントの送信方法

Method Swizzling を無効にした場合、通知を開封時に効果測定用のイベントが送信されないため、手動でイベントを送信する処理を実装する必要があります。

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()
    // ★追加★ クリックイベントを送信
    notification.track()
  } else {
    // KARTE以外のシステムから送信されたプッシュ通知
  }
  completionHandler()
}
import { Notification } from '@react-native-karte/notification';
import messaging from '@react-native-firebase/messaging';

messaging()
  .getInitialNotification()
  .then((remoteMessage) => {
    if (remoteMessage) {
      const notification = Notification.create(remoteMessage);
      if (notification) {
        // 通知に含まれるディープリンクをハンドル
        notification.handle();
        // ★追加★ クリックイベントを送信
        notification.track();
      }
    }
});

messaging().onNotificationOpenedApp((remoteMessage) => {
  if (remoteMessage) {
    const notification = Notification.create(remoteMessage);
    if (notification) {
      // 通知に含まれるディープリンクをハンドル
      notification.handle();
      // ★追加★ クリックイベントを送信
      notification.track();
    }
  }
});