# \[iOS]画面の境界を認識する条件

KARTE SDKでは画面の境界を認識することで、アプリ内メッセージの表示制御を行う機能があります。\
本ドキュメントでは画面の境界を認識する条件について記載します。

## 画面の境界を認識する条件

画面の境界を認識する条件は2つあります。

* 画面遷移の発生
* Viewイベントの発火時（KARTEのサーバーにイベントが到達したかは問わない）

{% hint style="warning" %}
**ブリッジSDK利用時の注意点**

FlutterやReact Nativeなどを対象としたブリッジSDKをご利用中の場合。\
画面遷移により画面境界を認識するかどうかはフレームワークやライブラリ等に依存します。\
確実に画面境界を認識するために全ての画面でviewイベントを実装することを推奨します。
{% endhint %}

### 画面遷移の発生

利用頻度が高い下記コントローラで画面遷移処理が呼び出された場合に、SDKは画面境界を認識します。

| コントローラ名                | メソッド名・プロパティ名                       |
| ---------------------- | ---------------------------------- |
| UIViewController       | present(\_:animated:completion:)   |
| UIViewController       | dismiss(animated:completion:)      |
| UINavigationController | setViewControllers(\_:animated:)   |
| UINavigationController | pushViewController(\_:animated:)   |
| UINavigationController | popViewController(animated:)       |
| UINavigationController | popToViewController(\_:animated:)  |
| UINavigationController | popToRootViewController(animated:) |
| UITabBarController     | selectedIndex                      |
| UITabBarController     | selectedViewController             |

ただし画面境界の判断は `modalPresentationStyle` の値に影響を受けます。\
`custom` `overFullScreen` `overCurrentContext` および`popover` の場合は画面境界として判定しません。\
`popover`の場合は `UIAdaptivePresentationControllerDelegate` により提供される `adaptivePresentationStyle` の値がこの判定に採用されます。\
これは半モーダルなどの表現は画面コンテキストが継続していると定義しているためです。

※SwiftUIを利用している場合でも、importされたUIKit上で上記の画面遷移処理が呼び出された際にはSDKが画面境界を認識します。

### Viewイベントの発火

Viewイベントの発火（viewメソッドの呼び出し）が行われた時点で画面の境界を認識します。

{% hint style="warning" %}
**Viewイベントを送信しても画面境界として認識されないパターンについて**

WebView内の計測タグからViewイベントを送信した場合は、画面境界として認識されません。\
画面境界として認識されるのは、あくまでもネイティブSDKでViewイベントを送信した場合に限ります。
{% endhint %}

## 画面境界の認識をViewイベントに限定する方法

UIKitを利用している場合に、SDKは一定の条件を[画面の境界](#画面の境界を認識する条件)として自動認識します。

アプリの実装によっては画面境界の認識とviewイベントの送信タイミングが意図しない順序になる場合もあり、そのような場合には[表示制御](https://support.karte.io/post/3JaA3BlXQea59AaPGxD3bb)を利用しても意図したIAMの動作を実現出来ない場合があります。

このような場合には`InAppMessagingConfiguration`オプションを無効化することで、画面境界の認識をviewイベントのみに限定できます。（≒viewイベント以外の意図しない画面境界の認識を抑制できます）

`InAppMessagingConfiguration`の無効化は、SDKの初期化時に`isAutoScreenBoundaryEnabled`のflagをfalseにして渡すことで無効化できます。

{% code overflow="wrap" %}

```swift
let iamConfiguration = InAppMessagingConfiguration()
iamConfiguration.isAutoScreenBoundaryEnabled = false

let configuration = Configuration { (configuration) in
    configuration.libraryConfigurations = [iamConfiguration]
}

KarteApp.setup(appKey: appKey, configuration: configuration)
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://app.developers.karte.io/ios-sdk-appendix/concepts-boundary-transition-ios-sdk.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
