> ## Documentation Index
> Fetch the complete documentation index at: https://help.airbridge.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Webview 에서 트래킹링크가 열리는 경우 - 안드로이드 SDK (Deprecated)

<Danger>
  비공개 가이드: 필요한 고객사에게만 제공됩니다. 외부에 공개되지 않도록 주의해 주세요.
</Danger>

## 개요

***

에어브릿지의 트래킹링크는 Webview 환경에서는 고객사의 트래킹링크가 고객사의 앱에서 열리는 경우, 다른 앱에서 열리는 경우에 비해서 딥링크 UX 가 떨어질 수 있습니다. 이에 이 문서에서는 Webview 환경에서 트래킹링크가 클릭되었을 때, 트래킹링크를 에어브릿지 SDK 가 Webview 대신 열어 문제를 해결하는 방법에 대해서 서술합니다. 이 문서에서는 아래 단계를 통해 문제를 해결합니다.

1. 에어브릿지 SDK 가 트래킹링크를 여는 함수에 대한 설명
2. 앱의 Webview 영역에서 트래킹링크가 클릭되는 경우를 감지
3. 에어브릿지 SDK 가 대신 트래킹링크를 열도록 설정

<Danger>
  **주의하세요**

  다른 고객사의 트래킹링크가 고객사의 앱에서 열리는 경우, 다른 고객사의 앱이 설치되어 있지 않고 트래킹링크의 Fallback 이 웹으로 설정되어 있는 경우, Webview 가 아닌 사용자의 기본 브라우저로 Fallback 으로 설정된 웹이 열리게 됩니다.
</Danger>

## 에어브릿지가 SDK 가 트래킹링크를 여는 함수

***

에어브릿지 SDK 에는 Placement Click 이라는 함수를 제공하여 네이티브 영역에서 트래킹링크를 열 수 있는 기능을 제공합니다. 해당 기능을 아래와 같은 코드를 통해 사용할 수 있습니다.

`Airbridge.click` 의 매개변수로 `AirbridgeCallback<Boolean>` 을 전달하여 응답에 대한 callback 을 받을 수도 있습니다.

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  var trackingLink: String = "..."
  Airbridge.click(trackingLink)
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  String trackingLink = "...";
  Airbridge.click(trackingLink);
  ```
</CodeGroup>

## 앱의 Webview 영역에서 트래킹링크가 클릭되는 경우를 감지

***

`WebViewClient` 에서는 `WebViewClient#shouldOverrideUrlLoading` 를 구현하는 것으로 특정 URL 이 로딩되는 것을 감지하고, 그 URL 의 로딩 할 것인지, 멈출 것 인지를 결정할 수 있습니다. 아래의 단계에 따라 코드를 구현하여 그 URL 이 에어브릿지 트래킹링크인지 감지합니다.

📘 [WebViewClient Android 개발자 문서](https://developer.android.com/reference/android/webkit/WebViewClient#shouldOverrideUrlLoading\(android.webkit.WebView,%20java.lang.String\))

### WebViewClient 사용하기

`WebViewClient#shouldOverrideUrlLoading` 를 구현하기 위해서 'webViewClient' instance 를 생성하여 주고 `webView#setWebViewClient` 에 생성된 instance 를 설정한다.

`WebViewClient#shouldOverrideUrlLoading` 의 result 로 해당 'WebResourceRequest' 처리 여부를 반환 한다.

`WebViewClient#shouldOverrideUrlLoading` 를 구현하여 어떤 URL 로딩 되는지 감지합니다. 로딩이 이루어지는 URL은 함수 인자 중 `WebResourceRequest`에서 `request.url`의 형태로 전달됩니다.

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  private val webViewClient = object : WebViewClient() {

      override fun shouldOverrideUrlLoading(
          view: WebView?,
          request: WebResourceRequest?
      ): Boolean {
          return super.shouldOverrideUrlLoading(view, request)
      }
  }

  private fun initWebview() {
      webView.webViewClient = webViewClient
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  private final WebViewClient webViewClient = new WebViewClient() {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
          return super.shouldOverrideUrlLoading(view, request);
      }
  }

  private void initWebView() {
      webView.setWebViewClient(webViewClient);
  }
  ```
</CodeGroup>

### 에어브릿지 트래킹링크인지 판별

로딩이 이루어지는 URL 중 에어브릿지 트래킹링크인 경우를 구분합니다. 에어브릿지 트래킹링크는 URL 의 host 가 `abr.ge` 이거나 `YOUR_APP_NAME.deeplink.page` 또는 커스텀 도메인입니다.

📘 `YOUR_APP_NAME` 은 대시보드의 **`Settings > Tokens > 앱 이름`** 에서 확인할 수 있습니다.

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  override fun shouldOverrideUrlLoading(
      view: WebView?,
      request: WebResourceRequest?
  ): Boolean {

      request?.url?.let {

          val airbridgeHosts = arrayOf(
              "abr.ge",
              "YOUR_APP_NAME.abr.ge",
              "YOUR_APP_NAME.deeplink.page"
          )

          if (airbridgeHosts.contains(it.host)) {
              return true
          }
      }

      return false
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  private final WebViewClient webViewClient = new WebViewClient() {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
          Uri uri = request == null ? null : request.getUrl();
          if (uri != null) {
              String host = uri.getHost();

              List<String> airbridgeHosts = Arrays.asList(
                      "abr.ge",
                      "YOUR_APP_NAME.abr.ge",
                      "YOUR_APP_NAME.deeplink.page"
              );

              if (airbridgeHosts.contains(host)) {
                  return true;
              }
          }

          return false;
      }
  };
  ```
</CodeGroup>

## 에어브릿지 SDK 가 대신 트래킹링크를 열도록 설정

***

위 단계를 통해 Webview 에서 에어브릿지 트래킹링크가 로딩되는 경우를 감지할 수 있습니다.

아래와 같이 감지되었을 때 `Airbirdge.click` 함수를 사용하고, `webView#shouldOverrideUrlLoading` 의 result 값을 true 를 보내 **Webview 대신 에어브릿지 SDK 가 트래킹링크를 열도록** 할 수 있습니다.

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  override fun shouldOverrideUrlLoading(
      view: WebView?,
      request: WebResourceRequest?
  ): Boolean {

      request?.url?.let {

          val airbridgeHosts = arrayOf(
              "abr.ge",
              "YOUR_APP_NAME.abr.ge",
              "YOUR_APP_NAME.deeplink.page"
          )

          if (airbridgeHosts.contains(it.host)) {
              decisionHandler(it)
              return true
          }
      }

      return false
  }

  private fun decisionHandler(uri : Uri) {
      Airbridge.click(uri.toString())
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  private final WebViewClient webViewClient = new WebViewClient() {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
          Uri uri = request == null ? null : request.getUrl();
          if (uri != null) {
              String host = uri.getHost();

              List<String> airbridgeHosts = Arrays.asList(
                      "abr.ge",
                      "YOUR_APP_NAME.abr.ge",
                      "YOUR_APP_NAME.deeplink.page"
              );

              if (airbridgeHosts.contains(host)) {
                  decisionHandler(uri)
                  return true;
              }
          }

          return false;
      }
  };

  private void decisionHandler(Uri uri) {
      Airbridge.click(uri.toString());
  }
  ```
</CodeGroup>

## 마무리

***

모든 구현이 완료되었습니다. 다음은 가이드에서 사용된 코드 전문입니다.

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout....)
      initWebView()
  }

  private fun initWebView() {
      webView.settings.javaScriptEnabled = true
      webView.settings.domStorageEnabled = true
      webView.webViewClient = webViewClient
  }

  private val webViewClient = object : WebViewClient() {

      @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
      override fun shouldOverrideUrlLoading(
          view: WebView?,
          request: WebResourceRequest?
      ): Boolean {

          request?.url?.let {
              val airbridgeHosts = arrayOf(
                  "abr.ge",
                  "YOUR_APP_NAME.abr.ge",
                  "YOUR_APP_NAME.deeplink.page"
              )

              if (airbridgeHosts.contains(it.host)) {
                  decisionHandler(it)
                  return true
              }
          }

          return false
      }

      private fun decisionHandler(uri: Uri) {
          Airbridge.click(uri.toString())
      }
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout....);

      webView = findViewById(R.id....);
      initWebView();
  }

  private void initWebView() {
      webView.getSettings().setJavaScriptEnabled(true);
      webView.getSettings().setDomStorageEnabled(true);
      webView.setWebViewClient(webViewClient);
  }

  private final WebViewClient webViewClient = new WebViewClient() {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
          Uri uri = request == null ? null : request.getUrl();
          if (uri != null) {
              String host = uri.getHost();

              List<String> airbridgeHosts = Arrays.asList(
                      "abr.ge",
                      "YOUR_APP_NAME.abr.ge",
                      "YOUR_APP_NAME.deeplink.page"
              );

              if (airbridgeHosts.contains(host)) {
                  decisionHandler(uri)
                  return true;
              }
          }

          return false;
      }
  };

  private void decisionHandler(Uri uri) {
      Airbridge.click(uri.toString());
  }
  ```
</CodeGroup>

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/open-link-in-webview-deprecated-android-sdk-v2" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/open-link-in-webview-deprecated-android-sdk-v2" />
