— Universal Links に対応する

Usage

KARTE iOS SDKのアプリ内メッセージやプッシュ通知では、標準的な実装を行った時、クリック時の遷移先にリンクを指定すると、 UIApplication クラスの open(_:options:completionHandler:) を呼び出し外部アプリを起動します。
http または https から始まるリンクの場合は Safari等のブラウザが起動します。
そのため、ボタンのリンク等にアプリ内遷移用の Universal Links を設定していても、標準の挙動ではブラウザアプリを起動してしまいます。

参考:

KARTEのアクションにおいて Universal Links を利用したアプリ内処理を行いたい場合は、独自にアプリ内処理を実装する必要があります。

アプリ内メッセージのリンクでの対応

アプリ内メッセージ上のリンククリック後、指定したURLを用いてアプリケーション側でUniversal Linksを受け取った時と同等の処理を行いたい場合、InAppMessagingDelegate プロトコルの inAppMessaging(_:shouldOpenURL:) を実装し、URLを確認することで処理を行うことができます。

func inAppMessaging(_ inAppMessaging: InAppMessaging, shouldOpenURL url: URL) -> Bool {

  // 特定のホスト・パス等でuniversal linksで起動された際と同じ処理を行う
  if url.host == "your.app.domain.com" {
    handleUniversalLinks(url)
    // SDKの処理を止める場合は `false` を返す
    return false
  }

  // その他のURL等、SDKに移譲する場合は `true` を返す
  return true
}
- (BOOL)inAppMessaging:(KRTInAppMessaging *)inAppMessaging shouldOpenURL:(NSURL *)url {

    // 特定のホスト・パス等でuniversal linksで起動された際と同じ処理を行う
    if ([url.host isEqualToString:@"your.app.domain.com"]) {
        handleUniversalLinks(url);
        // SDKの処理を止める場合は `NO` を返す
        return NO;
    }

    // その他のURL等、SDKに移譲する場合は `YES` を返す
    return YES;
}

また委譲先のインスタンスの登録は、以下のように実装します。

InAppMessaging.shared.delegate = instance
[[KRTInAppMessaging shared] setDelegate:instance];

プッシュ通知での対応

プッシュ通知をタップした際に、指定したURLを用いてアプリケーション側でUniversal Linksを受け取った時と同等の処理を行いたい場合、通知タップ時のコールバック上でURLを確認することで処理を行うことができます。
参考:プッシュ通知を受信する | 通知開封時の処理を実装する

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) {

    // 特定のホスト・パス等でuniversal linksで起動された際と同じ処理を行う
    if url?.host == "your.app.domain.com" {
      handleUniversalLinks(url)
      completionHandler()
      return
    }

    // その他の場合はSDKの機能を用いて外部アプリを開く
    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) {
    
    // 特定のホスト・パス等でuniversal linksで起動された際と同じ処理を行う
    NSURL *url = [notification url];
    if (url && [url.host isEqualToString:@"your.app.domain.com"]) {
        handleUniversalLinks(url);
        completionHandler();
        return;
    }

    // その他の場合はSDKの機能を用いて外部アプリを開く
    [notification handle];
  } else {
    // KARTE以外のシステムから送信されたプッシュ通知
  }
  completionHandler();
}