# 커스텀 클릭 핸들러

## 1. 개요

푸시 또는 인앱 메시지 캠페인에서 사용자가 메시지를 클릭했을 때, SDK는 기본적으로 아래와 같이 동작합니다.

| URL 유형            | 기본 동작           |
| ----------------- | --------------- |
| 웹 링크 (http/https) | **외부 브라우저**로 열림 |
| 딥링크               | 설정한 대로 동작       |

이 동작은 푸시와 인앱메시지 모두 동일하게 적용됩니다.

{% hint style="warning" %}
**웹뷰 기반 앱(웹앱)을 운영하는 고객사는 커스텀 클릭 핸들러 구현을 강력히 권장드립니다.**\
SDK 기본 동작에서 웹 링크(http/https)는 외부 브라우저로 열리기 때문에, 웹뷰 기반 앱에서는 사용자가 앱을 이탈하게 됩니다. 반드시 커스텀 핸들러를 등록하여 앱 내 WebView에서 직접 처리하는 것을 권장드립니다.
{% endhint %}

필요에 따라 앱에서 직접 클릭 이벤트를 처리할 수 있도록 **커스텀 클릭 핸들러**를 등록할 수 있습니다. 등록할 경우 SDK 기본 구현은 동작하지 않으며, 딥링크 실행 등을 직접 처리해주시면 됩니다.

## 2. 설정 방법

### 2-1. iOS 사전 작업

info.plist 에 `MarketapClickCustomized` 를 `true`로 등록해주세요.

<figure><img src="https://260547158-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FTQoY0rYrzNUQxhlUfYFm%2Fuploads%2FhXF0o3M5hv5Wc6nNA7Nx%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202025-07-08%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.03.03.png?alt=media&#x26;token=95098b7e-2c30-44f3-83d1-32e1b6b3c1ca" alt=""><figcaption></figcaption></figure>

### 2-2. Android 사전 작업

AndroidManifest.xml 파일의 `<application>` 태그 내부에 `com_marketap_is_click_customized` 메타데이터를 추가해주세요.

<pre class="language-xml"><code class="lang-xml">&#x3C;manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    ...
    &#x3C;application
        android:name=".MyApplication"
        ...>

<strong>        &#x3C;meta-data
</strong><strong>            android:name="com_marketap_is_click_customized"
</strong><strong>            android:value="true" />
</strong>        ...
</code></pre>

### 2-3. Flutter 사전 작업

Flutter에서 발생하는 클릭은 모두 ios, android 네이티브 sdk로 전파되어 처리됩니다.

[#id-2-1.-ios](#id-2-1.-ios "mention"), [#id-2-2.-android](#id-2-2.-android "mention") 을 각각 완료해주세요.

### 2-4. React Native 사전 작업

React Native에서 발생하는 클릭은 모두 ios, android 네이티브 sdk로 전파되어 처리됩니다.

[#id-2-1.-ios](#id-2-1.-ios "mention"), [#id-2-2.-android](#id-2-2.-android "mention") 을 각각 완료해주세요.

### 2-5. 웹앱 사전 작업

모바일 웹뷰를 통해 웹페이지를 랜더링하는 웹앱일 경우 [웹뷰 브릿지](https://docs.marketap.io/t3ZS4WXNMj0HK27EtIMV/developer/advanced-usage/webview-bridge) 연동이 권장됩니다. 연동을 완료한 경우 클릭 액션을 각 플랫폼에서 제어할 수 있습니다.

[#id-2-1.-ios](#id-2-1.-ios "mention"), [#id-2-2.-android](#id-2-2.-android "mention") 을 각각 완료해주세요.

### 2-6. 등록하기

이제 `setClickHandler` 함수를 사용해서 클릭 핸들러를 등록할 수 있습니다.

{% tabs %}
{% tab title="IOS - Swift" %}

<pre class="language-swift"><code class="lang-swift">func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {    
    // event: MarketapClickEvent
    // ├─ campaignType: .push 또는 .inAppMessage
    // ├─ campaignId: 캠페인 ID
    // └─ url: 설정된 딥링크 URL (Optional)
<strong>    Marketap.setClickHandler { event in
</strong><strong>        // 딥링크 수신 시 앱 내 라우팅 처리 예시
</strong><strong>        if let urlString = event.url, let url = URL(string: urlString) {
</strong><strong>            DeepLinkRouter.route(to: url)
</strong><strong>        }
</strong><strong>    }
</strong>}
</code></pre>

{% endtab %}

{% tab title="IOS - Objc" %}

```
[Marketap setClickHandlerObjC:^(MarketapClickEventObjC *event) {
    NSLog(@"id=%@ url=%@", event.campaignId, event.url);
}];
```

{% endtab %}

{% tab title="Android - Kotlin" %}

<pre class="language-kotlin"><code class="lang-kotlin">class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        // click: MarketapClickEvent
        // ├─ campaignType: PUSH 또는 IN_APP_MESSAGE
        // ├─ campaignId: 캠페인 ID
        // └─ url: 설정된 딥링크 URL (nullable)
<strong>        Marketap.setClickHandler { click ->
</strong><strong>            // 딥링크 수신 처리 예시
</strong><strong>            click.url?.let { urlString ->
</strong><strong>                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(urlString)).apply {
</strong><strong>                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
</strong><strong>                }
</strong><strong>                startActivity(intent)
</strong><strong>            }
</strong><strong>        }
</strong>    }
}
</code></pre>

{% endtab %}

{% tab title="Flutter" %}

```dart
Marketap.setClickHandler((event) {
  // event: MarketapClickEvent
  // ├─ campaignType: MarketapCampaignType.push 또는 inAppMessage
  // ├─ campaignId: 캠페인 ID
  // └─ url: 설정된 딥링크 URL (nullable)

  // 앱 내 링크 처리 로직
  launchUrlString(event.url);
});
```

{% endtab %}

{% tab title="React Native" %}

```typescript
Marketap.setClickHandler((event: MarketapClickEvent) => {
    // ├─ campaignType: MarketapCampaignType.push 또는 inAppMessage
    // ├─ campaignId: 캠페인 ID
    // └─ url: 설정된 URL (nullable)
    
    // TODO
}
```

{% endtab %}
{% endtabs %}
