에어브릿지의 트래킹링크는 Webview 환경에서는 고객사의 트래킹링크가 고객사의 앱에서 열리는 경우, 다른 앱에서 열리는 경우에 비해서 딥링크 UX 가 떨어질 수 있습니다. 이에 이 문서에서는 Webview 환경에서 트래킹링크가 클릭되었을 때, 트래킹링크를 에어브릿지 SDK 가 Webview 대신 열어 문제를 해결하는 방법에 대해서 서술합니다. 이 문서에서는 아래 단계를 통해 문제를 해결합니다.
에어브릿지 SDK 가 트래킹링크를 여는 함수에 대한 설명
앱의 Webview 영역에서 트래킹링크가 클릭되는 경우를 감지
에어브릿지 SDK 가 대신 트래킹링크를 열도록 설정
주의하세요
다른 고객사의 트래킹링크가 고객사의 앱에서 열리는 경우, 다른 고객사의 앱이 설치되어 있지 않고 트래킹링크의 Fallback 이 웹으로 설정되어 있는 경우, Webview 가 아닌 사용자의 기본 브라우저로 Fallback 으로 설정된 웹이 열리게 됩니다.
에어브릿지 SDK 에는 Placement Click 이라는 함수를 제공하여 네이티브 영역에서 트래킹링크를 열 수 있는 기능을 제공합니다. 해당 기능을 아래와 같은 코드를 통해 사용할 수 있습니다.
Airbridge.click 의 매개변수로 AirbridgeCallback<Boolean> 을 전달하여 응답에 대한 callback 을 받을 수도 있습니다.
var trackingLink: String = "..."Airbridge.click(trackingLink)String trackingLink = "...";Airbridge.click(trackingLink);WebViewClient 에서는 WebViewClient#shouldOverrideUrlLoading 를 구현하는 것으로 특정 URL 이 로딩되는 것을 감지하고, 그 URL 의 로딩 할 것인지, 멈출 것 인지를 결정할 수 있습니다. 아래의 단계에 따라 코드를 구현하여 그 URL 이 에어브릿지 트래킹링크인지 감지합니다.
📘 WebViewClient Android 개발자 문서
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}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);} 로딩이 이루어지는 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}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; }};위 단계를 통해 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())}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());}모든 구현이 완료되었습니다. 다음은 가이드에서 사용된 코드 전문입니다.
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()) }}@Overrideprotected 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());}도움이 되었나요?