# 딥 링크

> 딥 링크를 구현하여 웹 오퍼월을 웹사이트나 모바일 앱에 연동합니다.

직접 링크를 사용하면 웹사이트를 오퍼월에 아주 간단하게 연결할 수 있습니다. 오퍼월을 표시하려는 곳에서 다음 URL을 링크로 제공합니다.

```text
https://rewards.unity.com/owp/web/link/<SDK_KEY>/u/<USER_ID>
```

## 필수 파라미터##required-parameters

* **SDK\_KEY** - 탭조이에서 제공하는 SDK 키입니다.
* **USER\_ID** - 사용자에게 적절한 보상을 제공하려면 직접 사용자 ID를 제공해야 합니다. 자세한 내용은 [자체 관리형 재화](/grow/offerwall/monetization/virtual-currency/self-managed-currency.md)를 참고하십시오.

> **Note:**
>
> 이는 URL의 일부로 적용되므로 **USER\_ID**는 URL에 적용해도 안전하거나 URL에서 사용하도록 인코딩되어야 합니다.

## 파라미터(선택 사항)##optional-parameters

### 사용자 개인정보 보호##user-privacy

사용자 개인정보 보호는 URL에 쿼리 파라미터를 추가하여 구현할 수 있습니다. 각 플래그에 관한 자세한 내용은 [사용자 개인정보 보호](/grow/offerwall/web/advanced/user-privacy.md)를 참고하십시오.

```text
https://rewards.unity.com/owp/web/link/<SDK_KEY>/u/<USER_ID>?gdpr=1&cgdpr=1&...
```

| 옵션                    | 쿼리 파라미터 이름          | 기본값    | 설명                                                                         |
| --------------------- | ------------------- | ------ | -------------------------------------------------------------------------- |
| 사용자가 GDPR의 적용 대상인지 여부 | `gdpr`              | `0`    | 사용자가 GDPR 적용 대상이면 값은 `1`이어야 합니다.                                           |
| GDPR 동의               | `cgdpr`             | `0`    | `0`은 사용자가 동의하지 않는다는 의미이며, `1`은 사용자가 동의한다는 의미입니다.                           |
| 동의 연령 미만              | `below_consent_age` | `0`    | `1`과 `0` 값은 각각 사용자가 동의 연령 미만인지 여부를 나타냅니다.                                  |
| 미국 개인정보 보호            | `us_privacy`        | `1---` | 값 설명은 [사용자 개인정보 보호](/grow/offerwall/web/advanced/user-privacy.md)를 참고하십시오. |

### 이벤트 이름##event-name

`event_name` 파라미터는 웹사이트 또는 모바일 앱에서 어떤 [플레이스먼트](../../monetization/dashboard/placements)를 로드할지 선택합니다. 탭조이는 플레이스먼트를 로딩하면 해당 플레이스먼트와 연결된 [콘텐츠 카드](../../monetization/dashboard/offerwall-cards)를 렌더링합니다.

`event_name`를 생략하면 탭조이는 기본적으로 표준 오퍼월을 로딩합니다.

> **Important:**
>
> `event_name`
>
> &#x20;파라미터를 생략하는 경우, URL을 사용하기 전에 탭조이 대시보드에서&#x20;
>
> `#WebOfferwall`
>
> &#x20;플레이스먼트 항목을 생성하고 이를 콘텐츠 카드에 연결해야 합니다. 자세한 내용은 플레이스먼트 기술 자료의&#x20;
>
> [플레이스먼트 생성](../../monetization/dashboard/placements#create-a-placement)
>
> &#x20;섹션과 오퍼월 카드 기술 자료의&#x20;
>
> [오퍼월 생성](/grow/offerwall/monetization/dashboard/content-cards.md#create-a-content-card)
>
> &#x20;섹션을 참고하십시오.

event\_name을 사용하여 플레이스먼트를 지정하려면 다음 딥 링크 형식을 사용하십시오.

```text
https://rewards.unity.com/owp/web/link/<SDK_KEY>/u/<USER_ID>?event_name=<PLACEMENT_NAME>
```

### 사용자 태그##user-tags

웹 오퍼월은 [사용자 태그](/grow/offerwall/monetization/dashboard/targeting.md)가 있는 세그먼트 타게팅을 지원합니다. `user_tags[]=`를 사용하여 여러 사용자 태그를 전달할 수 있습니다.

```text
https://rewards.unity.com/owp/web/link/<SDK_KEY>/u/<USER_ID>?user_tags[]=<TAG1>&user_tags[]=<TAG2>
```

### 커스텀 파라미터##custom-parameter

커스텀 파라미터 `cp`를 사용하여 클릭과 전환에 대한 특정 세부 정보를 추적할 수 있도록 사용자 정의 값을 전달할 수 있습니다.

```text
https://rewards.unity.com/owp/web/link/<SDK_KEY>/u/<USER_ID>?cp=xxx
```

## iframe 포함##embedding-with-iframe

iframe에 웹 오퍼월을 포함할 때 iframe의 크기가 디바이스 화면 뷰포트를 초과하지 않도록 해야 합니다. 그렇지 않으면 노출되는 뷰포트 범위를 벗어나 명령 CTA 버튼이 나타나고 사용자가 버튼에 액세스하려면 아래로 스크롤해야 합니다.

![아이프레임에 내장된 Web Offerwall의 예로, 크기가 너무 큰 iframe이 명령, 명령어 CTA 버튼을 표시되는 뷰포트 밖으로 푸시하는 방법을 보여줍니다.](/api/media?file=/grow/media/images/webofferwall_iframe.jpg)

이 가이드라인을 준수하면 개발자는 웹 오퍼월 제품의 활용성과 사용자 참여를 극대화하여 중요한 UI 요소에 수월하게 액세스하도록 보장할 수 있습니다.

## 모바일 앱의 웹 오퍼월##web-offerwall-from-mobile-apps

WebView에 링크를 로드하여 모바일 앱에서 웹 오퍼월을 사용할 수 있습니다.

### 예시##examples

#### Android##android

웹 오퍼월은 아직 Android 백 버튼을 완전히 처리하지 않으므로 Android 백 버튼을 오버라이드하고 자체 UI를 구현하여 WebView를 닫는 것이 좋습니다. 이렇게 하면 사용자가 의도치 않게 WebView를 닫는 일을 방지하고 대신 OW 내에서 내비게이션 UI를 사용할 수 있습니다.

1. **Android**

   ```java
   void showWebOfferwall() {
     final WebView webView = new WebView(requireContext());
     webView.getSettings().setJavaScriptEnabled(true);
     webView.getSettings().setDomStorageEnabled(true);
     webView.getSettings().setMediaPlaybackRequiresUserGesture(false);
     webView.setBackgroundColor(Color.TRANSPARENT);
     webView.loadUrl("https://rewards.unity.com/owp/web/link/sdk_key/u/user_id");

     RelativeLayout.LayoutParams paramsWebView = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
     Dialog dialog = new Dialog(requireContext(), android.R.style.Theme_Black_NoTitleBar_Fullscreen);
     dialog.addContentView(webView, paramsWebView);

     // Handle backbutton
     dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
       @Override
       public boolean onKey(DialogInterface dialogInterface, int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
           if (webView.canGoBack()) {
             webView.goBack();
           }
         }
         // return true to prevent closing the WebView
         return true;
       }
     });

     dialog.show();
   }
   ```

2. **iOS (Objective-C)**

   ```objective-c
   - (IBAction)showOfferwallAction:(id)sender {
     WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];
     configuration.allowsInlineMediaPlayback = YES;
     configuration.allowsAirPlayForMediaPlayback = NO;

     WKWebView* webview = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
     [webview setUIDelegate:self];

     [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://rewards.unity.com/owp/web/link/sdk_key/u/user_id"]]];
     [self.view addSubview:webview];
   }

   // Open external browser for window.open() or target = _blank
   - (WKWebView *)webView:(WKWebView *)webView
   createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
      forNavigationAction:(WKNavigationAction *)navigationAction
           windowFeatures:(WKWindowFeatures *)windowFeatures {
     NSURL *url = navigationAction.request.URL;
     [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
       if(!success) {
         NSLog(@"Failed to open URL: %@", [url absoluteString]);
       }
     }];
     return nil;
   }
   ```
