본문 바로가기
카테고리 없음

Android WebView Deep Link 처리하기

by HlAos 2024. 9. 8.
반응형

 최근 앱 개발에서는 순수 네이티브 앱보다 하이브리드 앱이 점점 더 많아지고 있습니다. 이러한 하이브리드 앱은 웹뷰(WebView)를 포함하여 네이티브 껍데기 안에서 대부분의 기능을 웹 기반으로 구현하는 경우가 많습니다. 일부는 앱의 절반 정도가 웹뷰로 구성되기도 합니다.

특히, 스타트업에서 웹뷰를 많이 사용하는 경향이 두드러집니다. 스타트업은 제한된 리소스로 인해 Android와 iOS 네이티브 개발자를 모두 채용하기 어려운 경우가 많기 때문에, 웹뷰를 활용해 하이브리드 앱을 개발하여 시간과 비용을 절감하려는 것입니다. 이런 이유로 최근 들어 React 같은 프론트엔드 웹 기술을 활용하는 개발자의 수요가 크게 증가하고 있었다. 두가지를 해야할듯 하다.

 

아무튼 Android Deep Link 처리하는 방법은 여러 방법이 있다.

 

안드로이드 웹뷰(WebView) 기반의 앱에서 딥링크(Deep Link)를 처리하는 방법은 웹뷰가 외부 링크를 열거나 특정 URL 패턴에 반응하여 앱 내에서 특정 화면이나 동작을 수행하도록 구현하는 것을 의미합니다. 웹뷰에서 딥링크를 처리하는 방법은 크게 두 가지로 나뉩니다.

앱 외부 딥링크 처리앱 내부 딥링크 처리

 

1. 앱 외부 딥링크 처리 (외부 브라우저나 다른 앱 열기)

웹뷰에서 외부 링크(예: 외부 브라우저로 열려는 URL)가 있을 경우, 웹뷰 대신 기본 브라우저나 다른 앱을 열도록 할 수 있습니다.

방법: 웹뷰에서 shouldOverrideUrlLoading 메서드를 오버라이드하여 딥링크를 처리합니다.

이 코드는 특정 URL 패턴에 따라 기본 브라우저나 전화, 이메일 앱을 여는 방식입니다.

webView.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        url?.let {
            if (it.startsWith("http://") || it.startsWith("https://")) {
                // 외부 브라우저에서 열려는 경우
                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(it))
                startActivity(intent)
                return true
            } else if (it.startsWith("tel:") || it.startsWith("mailto:")) {
                // 전화 또는 이메일 처리
                val intent = Intent(Intent.ACTION_VIEW, Uri.parse(it))
                startActivity(intent)
                return true
            }
        }
        // 웹뷰에서 로드
        return false
    }
}

 

2. 앱 내부 딥링크 처리 (앱 내 특정 화면 이동)

앱 내부 딥링크 처리란 특정 URL을 앱 내에서 감지하여 해당 URL에 맞는 화면을 앱 내에서 열도록 하는 것을 의미합니다. 예를 들어, 웹뷰에서 특정 URL을 통해 네이티브 화면(예: 상품 상세 페이지)을 열 수 있습니다.

방법: shouldOverrideUrlLoading 메서드에서 특정 URL 패턴을 확인한 후, 네이티브 화면으로 전환하도록 구현할 수 있습니다.

webView.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
        url?.let {
            if (it.startsWith("myapp://")) {
                // 딥링크 감지하여 네이티브 화면으로 전환
                val intent = Intent(this@MainActivity, NativeActivity::class.java)
                intent.data = Uri.parse(it)
                startActivity(intent)
                return true
            }
        }
        // 웹뷰에서 로드
        return false
    }
}

 

3. 안드로이드 매니페스트에 딥링크 설정

앱이 외부에서 딥링크로 호출될 때도 처리할 수 있도록 AndroidManifest.xml 파일에 딥링크 설정이 필요합니다. 예를 들어, 특정 URL 패턴이 앱을 통해 열리도록 설정할 수 있습니다. 이렇게 하면 myapp://product 형식의 딥링크가 앱에서 열릴 수 있도록 구성됩니다.

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <!-- 딥링크 URI 패턴 -->
        <data android:scheme="myapp" android:host="product" />
    </intent-filter>
</activity>

 

4. URI 스킴을 사용한다. (android, ios 동일) , scheme://host_path

URI는 Uniform Resource Identifier라는 의미로 리소스를 나타내는 식별자 이다. URI은 다음과 같은 구조로 이루어져 있다.

<scheme>://<host>:<port>[<path>|<pathPrefix>|<pathPattern>]

 앱을 개발하는 주체가 앱 내 특정 페이지마다 path값을 등록하는 형태로 페이지를 구분한다. 해당 주소를 클릭하면 앱이 열리고 지정했던 특정 페이지가 열린다.

Scheme : 앱에서 설정할 수 있는 고유 값, 다른 앱에서 중복될 수 있음, 보안에 취약

path : 앱 내 특정 페이지를 지정

 

scheme 중복 사례 : 구글 스토어앱은 앱 오픈시 스킴값으로 market:// 사용, 후에 원스토어, galaxy store도 동일한 스킴을 사용하면서

해당 스킴 사용시 어떤 앱을 선택할지 다이어로그가 동시에 뜨는 문제가 있다.

 

5. App Link (https://host/path) 방법이 있으나 비추천

OS에 앱의 도메인 주소를 등록하여 소유권을 증명하는 방식은, 도메인이 고유하고 소유자만 관리할 수 있기 때문에 고유성이 보장됩니다. 링크 클릭시 앱이 설치되어있다면 즉시 열어서 보여주고 없다면 웹으로 이동합니다. 애플(유니버셜 링크)과 구글(앱 링크)은 이를 기반으로 딥링크를 처리하기로 결정, 해당 방식은 URI scheme의 한계(중복 문제 등)를 보완하는 효과적인 방법입니다.

  딥링크 앱링크
Intent URL scheme http, https 또는 custom scheme http 또는 https가 필요
Intent action 아무 액션이나 가능 android.intent.action.VIEW 필요
Intent category 아무 카테고리나 가능 android.intent.category.BROWSABLE
android.intent.category.DEFAULT
2가지가 필요하다
링크 인증 없음 HTTPS웹사이트내에 제공된 Digital Asset Link 파일이 필요하다
사용자 경험 링크를 눌렀을 때 사용자가 어떤 앱을 실행 할지 다이얼로그가 나타난다. 다이얼로그가 없으며, 웹사이트 링크를 통해 앱을 구동한다.
호환성 모든 버전 안드로이드 6.0 이상

 

  1. 앱 빌드 시 도메인 등록: 앱을 열기 위한 도메인을 등록하고, 보안을 위해 도메인의 특정 경로에 인증 텍스트를 배치.
  2. 소유권 검증: OS가 앱 설치 후 해당 도메인의 인증 텍스트와 앱 빌드 시 값을 비교하여 소유권을 검증. 검증 후에는 앱 삭제 전까지 유지.
  3. 딥링크 처리: 검증된 도메인으로 딥링크를 클릭하면, 앱이 설치된 경우 앱이 열리고, 설치되지 않았을 경우 fallback URL을 통해 웹 페이지가 실행됨.이 방식은 URI scheme의 한계(중복 문제 등)를 보완하는 효과적인 방법

- 문제 : 안드로이드에서만 동작, 데이터 유실의 문제, 랜딩 페이지 및 쿼리 파라미터 정보가 포함된 url을 앱이 설치되어 있지 않을 경우 앱 스토어로 이동하면서 잃어버리게 된다. 데이터 분석에 중요한 요소들을 트래킹하기 어려워진다.

 

6. 해당 문제를 해결하기 위해 나온 방법은 디퍼드 딥링크(deferred deep link), Airbridge 를 사용하면 디퍼드 딥링크를 구현 가능

- 유저가 앱이 없어도 앱을 설치유도후 다시 원하는 위치로 이동

  1. 사용자는 솔루션을 통해 생성된 딥링크를 클릭
  2. 앱이 설치되어있지 않다면, OS별 앱을 다운받을 수 있는 스토어로 이동
  3. 앱이 실행될 때 솔루션에서 제공하는 SDK를 초기화
  4. SDK 내부적으로 DB를 통해 기기식별 및 딥링크 데이터 조회
  5. 조회된 데이터를 통해 원하는 페이지로 딥링킹
  6. 생성된 딥링크를 클릭할 때 자동으로 솔루션에 URL 정보가 전송
  7. 나중에 앱이 실행되었을 때 SDK를 통해서 해당 사용자가 클릭했던 URL 정보를 가져옴

 

 

반응형