> ## 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.

# 하이브리드 앱 설정하기 - 안드로이드 SDK

<Info>
  **알립니다**

  하이브리드 앱 설정을 하기 전에 앱과 웹사이트에 각각 [안드로이드 SDK](/ko/developers/android-sdk-v4)와 [웹 SDK](/ko/developers/web-sdk)를 설치해 주세요.
</Info>

하이브리드 앱에서 웹 사이트 코드를 변경하지 않아도 인앱 웹 사이트에서 발생하는 에어브릿지 관련 작업을 안드로이드 SDK가 처리하도록 설정할 수 있습니다.

## 안드로이드 SDK가 웹 SDK 동작 처리하기

안드로이드 SDK는 웹 SDK에서 진행되는 이벤트 전송, 디바이스 설정, 유저 설정에 관한 명령을 대신 처리할 수 있습니다. 웹뷰에 웹 사이트를 표시하기 전에 `Airbridge.setWebInterface` 함수를 설정해 주세요.

`YOUR_WEB_TOKEN`은 [웹 SDK 토큰](/ko/guides/tokens#웹-sdk-토큰)입니다. 웹 SDK 토큰은 에어브릿지 대시보드의 \[설정]>\[토큰 관리]에서 확인할 수 있습니다.

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  class MainActivity : Activity() {
      
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)
          initWebView()
      }
      
      fun initWebView() {
          webView.settings.javaScriptEnabled = true
          webView.settings.domStorageEnabled = true
          
          Airbridge.setWebInterface(webView, "YOUR_WEB_TOKEN")

          webView.webChromeClient = WebChromeClient()
          webView.webViewClient =  WebViewClient()
          webView.loadUrl("https://my_company.com/main")
      }
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  public class MainActivity extends Activity {
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          initWebView();
      }
      
      void initWebView() {
          webView = findViewById(R.id.webView);
          webView.getSettings().setJavaScriptEnabled(true);
          webView.getSettings().setDomStorageEnabled(true);

          Airbridge.setWebInterface(webView, "YOUR_WEB_SDK_TOKEN");    
      
          webView.setWebChromeClient(new WebChromeClient());
          webView.setWebViewClient(new WebViewClient());
          webView.loadUrl("https://dev.blog.airbridge.io/websdk-web-app/");
      }
  }
  ```
</CodeGroup>

## 웹뷰에서 딥링크 동작하기

[Airbridge.click](/ko/developers/android-sdk-v4#인앱에서-트래킹-링크를-클릭) 함수를 추가하여 웹뷰에서 딥링크를 정상적으로 실행할 수 있습니다. 웹뷰는 기본적으로 딥링크를 지원하지 않습니다. 따라서 Airbridge.click 함수로 SDK가 대신 트래킹 링크의 딥링크를 실행하도록 설정해야 합니다.

`Airbridge.click` 함수는 입력된 주소가 트래킹 링크면 true를 반환합니다. 그리고 주소로 앱을 실행하면 `onSuccess` 함수를 호출합니다. 인터넷이 없거나 다른 앱이 실행되면 `onFailure` 함수가 호출됩니다.

`Airbridge.click` 함수는 입력된 주소가 트래킹 링크가 아니면 false를 반환하고 어떠한 동작을 하지 않습니다.

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  fun click(
      trackingLink: String,
      onSuccess: OnSuccess<Unit>? = null,
      onFailure: OnFailure? = null
  ): Boolean
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  boolean click(
      @NonNull String trackingLink,
      @Nullable OnSuccess<Unit> onSuccess,
      @Nullable OnFailure onFailure
  )
  ```
</CodeGroup>

`WebViewClient`에서 `WebViewClient#shouldOverrideUrlLoading`를 구현하면 특정 URL이 로딩되는 것을 확인한 후에 계속 로딩할지 또는 로딩하지 않을지 결정할 수 있습니다. [WebViewClient](https://developer.android.com/reference/android/webkit/WebViewClient#shouldOverrideUrlLoading\(android.webkit.WebView,%20android.webkit.WebResourceRequest\))에 대한 자세한 내용은 안드로이드 개발자 가이드를 참고해 주세요.

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

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

      @RequiresApi(Build.VERSION_CODES.N)
      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 WebViewClient webViewClient = new WebViewClient() {

      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          return super.shouldOverrideUrlLoading(view, url);
      }

      @Override
      @RequiresApi(Build.VERSION_CODES.N)
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
          return super.shouldOverrideUrlLoading(view, request);
      }
  };

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

로딩 중에 특정 URL이 에어브릿지의 트래킹 링크이면 `Airbirdge.click` 함수를 사용해 webView#shouldOverrideUrlLoading의 결과를 true로 전송할 수 있습니다. 이를 통해 Webview 대신 에어브릿지 안드로이드 SDK가 트래킹 링크를 열도록 할 수 있습니다.

에어브릿지 트래킹링크는 URL 의 host 가 `abr.ge` 이거나 `YOUR_APP_NAME.airbridge.io` 또는 커스텀 도메인입니다.

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

      private fun handleDomain(view: WebView, uri: Uri): Boolean =
          // return true when uri is tracking link
          // return false when uri is not tracking link
          Airbridge.click(uri.toString(), {
              // on success
              // do nothing
          }, {
              // on failure
              // when uri is another app's tracking link or sdk fails to open uri
              view.loadUrl(uri.toString())
          })

      override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
          if (view === null) return false
          if (url == null) return false

          val uri = Uri.parse(url) ?: return false
          return handleDomain(view, uri)
      }

      @RequiresApi(Build.VERSION_CODES.N)
      override fun shouldOverrideUrlLoading(
          view: WebView?,
          request: WebResourceRequest?
      ): Boolean {
          if (view === null) return false

          val uri = request?.url ?: return false
          return handleDomain(view, uri)
      }
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  private WebViewClient webViewClient = new WebViewClient() {

      private boolean handleDomain(@NonNull WebView view, @NonNull Uri uri) {
          // return true when uri is tracking link
          // return false when uri is not tracking link
          return Airbridge.click(uri.toString()
                  , result -> {
                      // on success
                      // do nothing
                  }, throwable -> {
                      // on failure
                      // when uri is another app's tracking link or sdk fails to open uri
                      view.loadUrl(uri.toString())
                  }
          );
      }

      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
          if (view == null) return false;
          if (url == null) return false;

          Uri uri = Uri.parse(url);
          if (uri == null) return false;

          return handleDomain(view, uri);
      }

      @Override
      @RequiresApi(Build.VERSION_CODES.N)
      public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
          if (view == null) return false;
          if (request == null) return false;

          Uri uri = request.getUrl();
          if (uri == null) return false;

          return handleDomain(view, uri);
      }
  };
  ```
</CodeGroup>

## 주의사항

아래 사항을 주의해 주세요.

<Accordion title="인앱 웹뷰의 이벤트 수집">
  하이브리드 앱 설정을 하면 웹 SDK만으로 인앱 웹뷰에서 발생하는 이벤트를 수집해야 합니다. 앱 SDK로 이벤트를 추가로 수집하면 해당 이벤트가 중복해서 집계됩니다.

  인앱 웹뷰에 실제 모바일 웹사이트를 사용하면 웹 SDK만으로 이벤트를 수집해 주세요.
</Accordion>

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/hybrid-app-settings-android-sdk-v4" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/hybrid-app-settings-android-sdk-v4" />
