アクションを配信する

🚧

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

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

送信したイベントをトリガーにした接客サービスが配信されると、アクションが自動で表示されます。
ほとんどの場合、アプリにアクションを表示するための特別な知識や実装は不要です。

このページではアクション表示時のSDKの詳細な挙動を説明します。

アクション表示の仕組み

SDKはアプリ内にセットしたWebView上でアクションを表示することで、HTML、CSS、JavaScriptによる表現を可能にしています。
アクションが配信されたとき、WebViewを持つWindowがアプリ内に設置されます。
このWindowはアクションの表示が必要な時のみ設置され、アクティブなアクションがなくなった時に非表示になります。

📘

Windowの表示レベルについて

アプリ内メッセージは、独自の Window を利用して表示しています。
表示時の WindowLevel は、 UIWindowLevelNormal + 10 としています。

🚧

Windowの表示について

Windowを表示する際、keyWindowとして表示します。
アプリケーション内でkeyWindowを参照する実装がある場合は、挙動が変わる可能性がありますのでご注意ください。

リンク

ユーザーがアクション内にある a タグをクリックしたとき、SDKはリンクを開くために UIApplication クラスの openURL: を自動的に呼び出します。

もしリンクをアプリ側で処理したい場合は、KarteInAppMessagingManagerDelegate プロトコルの inAppMessagingManager:shouldOpenURL: メソッドを実装したクラスのインスタンスを、KarteInAppMessagingManager クラスの delegate プロパティにセットすることで、独自にリンクを処理することが可能です。

class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    
    // リンクの処理を本クラスに委譲する
    KarteInAppMessagingManager.shared.delegate = self
  }
}

extension ViewController: KarteInAppMessagingManagerDelegate {
  func inAppMessagingManager(_ manager: KarteInAppMessagingManager, shouldOpen url: URL?) -> Bool {
    // TODO: 独自の処理を実装する
    return false
  }
}
@interface ViewController () <KarteInAppMessagingManagerDelegate>
@end

@implementation ViewController

- (void)viewDidLoad
{
  [super viewDidLoad];
  
  // リンクの処理を本クラスに委譲する
  KarteInAppMessagingManager.sharedManager.delegate = self;
}
  
- (BOOL)inAppMessagingManager:(KarteInAppMessagingManager *)manager shouldOpenURL:(NSURL *)url
{
  // TODO: 独自の処理を実装する
  return NO;
}

@end

なお Universal Links の URL は openURL: で自動で処理することができないため、inAppMessagingManager:shouldOpenURL: でフックして処理を行う必要があります。

アクションのリセット

画面遷移に伴い表示中のアクションを閉じるため、SDKは次のタイミングでアクションをリセットします。

  • view イベントの送信
  • アクション内のリンクのクリック
  • 画面遷移
  • KarteInAppMessagingManager クラスの dismiss メソッド呼び出し

viewイベントの送信によるアクションのリセットが行われる条件について

KARTE SDKのviewメソッド実行により送信されるviewイベントでのみアクションはリセットされます。
そのため、webview内で発生したviewイベントではアクションはリセットされません。
webivew連携している場合も同様です。

画面遷移によるアクションのリセットが行われる条件について

以下に記載の通り、各コントローラのメソッドを呼び出した際にアクションのリセットが行われます。

ただし modalPresentationStyle の設定が、UIModalPresentationCustom UIModalPresentationOverFullScreen UIModalPresentationOverCurrentContext Popover の場合は基本的にリセットが行われない仕様となっております。

コントローラ名メソッド名
UIViewControllerpresentViewController:animated:completion:
UIViewControllerdismissViewControllerAnimated:completion:
UINavigationControllersetViewControllers:animated:
UINavigationControllerpushViewController:animated:
UINavigationControllerpopViewControllerAnimated:
UINavigationControllerpopToViewController:animated:
UINavigationControllerpopToRootViewControllerAnimated:
UITabBarControllersetSelectedIndex:
UITabBarControllersetSelectedViewController:

明示的なアクションのリセットについて

KarteInAppMessagingManager クラスの dismiss メソッドを呼び出すことで、明示的にアクションのリセットを行うことが可能です。

if KarteInAppMessagingManager.shared.isPresenting
  KarteInAppMessagingManager.shared.dismiss()
if ([KarteInAppMessagingManager sharedManager].isPresenting) {
  [[KarteInAppMessagingManager sharedManager] dismiss];
}

🚧

制限事項

この機能は iOS SDK v1.5.0 から対応しています。

アクションを表示する画面を限定する方法について

イベントを送信してから接客サービスのレスポンスを受信する前に、ユーザーが別の画面に遷移している場合があります。
この時にアクションを表示するかどうかを接客サービスのオプションでコントロールできます。
設定は、接客サービス詳細 > オプション の「ネイティブアプリにおける接客表示制限」より行えます。

特定の画面にのみアクションを表示したい場合はこのオプションをONにしてください。

📘

別の画面に遷移したと判定する条件

遷移後の画面で view イベントを送信したタイミングで、別画面に遷移したと認識します。
そのため、遷移後の画面で view イベントを送信していない場合は、このオプションを有効にしても機能しません。

🚧

制限事項

この機能は iOS SDK v1.4.7 から対応しています。

アクションの表示開始と終了を検知する方法について

アプリ内メッセージの表示開始 (Window 生成) と終了 (Window 破棄) の通知を NSNotificationCenter 経由で受け取ることが可能です。

この時ポストされる通知は、以下の通りです。
なおそれぞれの通知名は KarteConstants.h に定義されています。

通知名内容
KarteInAppMessagingWillAppearアプリ内メッセージのウィンドウが表示状態になる直前にポストされます。
KarteInAppMessagingDidAppearアプリ内メッセージのウィンドウが表示状態になるとポストされます。
KarteInAppMessagingWillDisappearアプリ内メッセージのウィンドウが非表示状態になる直前にポストされます。
KarteInAppMessagingDidDisappearアプリ内メッセージのウィンドウが非表示状態になるとポストされます。

🚧

制限事項

この機能は iOS SDK v1.4.4 から対応しています。

アクションの表示を明示的に抑制する

KarteInAppMessagingManager クラスの suppress メソッドを呼び出すことで、明示的にアクションの表示を抑制することができます。表示の抑制を解除するにはunsuppress を呼び出します。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // アクションの表示抑制を解除します
    KarteInAppMessagingManager.shared.unsuppress()
}


override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // アクションの表示を抑制します
    KarteInAppMessagingManager.shared.suppress()
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // アクションの表示抑制を解除します
    [[KarteInAppMessagingManager sharedManager] unsuppressShowingMessage];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    // アクションの表示を抑制します
    [[KarteInAppMessagingManager sharedManager] suppressShowingMessage];
}

🚧

制限事項

この機能は iOS SDK v1.6.2 から対応しています。