• 개발자 가이드
  • Android SDK (Deprecated)

Android SDK (Deprecated) - Webview 에서 트래킹링크가 열리는 경우

개요


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

  1. 에어브릿지 SDK 가 트래킹링크를 여는 함수에 대한 설명

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

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

주의하세요

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

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


에어브릿지 SDK 에는 Placement Click 이라는 함수를 제공하여 네이티브 영역에서 트래킹링크를 열 수 있는 기능을 제공합니다. 해당 기능을 아래와 같은 코드를 통해 사용할 수 있습니다. Airbridge.click 의 매개변수로 AirbridgeCallback<Boolean> 을 전달하여 응답에 대한 callback 을 받을 수도 있습니다.

var trackingLink: String = "..."Airbridge.click(trackingLink)

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


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

📘 WebViewClient Android 개발자 문서

WebViewClient 사용하기

WebViewClient#shouldOverrideUrlLoading 를 구현하기 위해서 'webViewClient' instance 를 생성하여 주고 webView#setWebViewClient 에 생성된 instance 를 설정한다. WebViewClient#shouldOverrideUrlLoading 의 result 로 해당 'WebResourceRequest' 처리 여부를 반환 한다. WebViewClient#shouldOverrideUrlLoading 를 구현하여 어떤 URL 로딩 되는지 감지합니다. 로딩이 이루어지는 URL은 함수 인자 중 WebResourceRequest에서 request.url의 형태로 전달됩니다.

private val webViewClient = object : WebViewClient() {  override fun shouldOverrideUrlLoading( view: WebView?, request: WebResourceRequest? ): Boolean { return super.shouldOverrideUrlLoading(view, request) }} private fun initWebview() { webView.webViewClient = webViewClient}

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

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

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

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}

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


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

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())}

마무리


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

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()) }}