딥링크 BASIC

2023. 7. 26. 11:08개발/Android

커스텀 스킴

…And More

Android 웹뷰에서 딥링크 열기

  1. manifest에 패키지 등록
<queries>
<package android:name="com.kakao.talk" /> <!--카카오톡-->
<package android:name="com.shcard.smartpay" /> <!--신한페이판-->
</queries>

  1. 필요한 액션을 발생시킬 페이지를 WebViewClient로 열기

→ 요청, 상태, 에러를 콜백으로 편리하게 처리 가능

  • 웹뷰에서 URL을 열 때는 shouldOverrideUrlLoading()를 사용
  • 메서드에서 true를 반환하면 URL은 개발자가 정의한 대로 열리고, false를 반환하면 현재 웹뷰에서 URL을 염
    • 먼저 딥링크를 파싱해서 URI 객체로 만들고, 그리고 스킴을 확인함
    • Intent 스킴이라면 startSchemeIntent()함수를 호출
    • Intent 스킴 링크를 열어보고 앱이 설치 안 되어 있다면, Intent 스킴에 포함된 앱 패키지 정보로 스토어를 염
    • Intent 스킴이 아니라면 커스텀 링크 또는 App Link → 해당 딥링크로 Activity를 시작
    • 링크에 오타가 있거나 문제가 있어서 정상적으로 Activity가 실행되지 않는다면, false를 반환해서 웹뷰에서 링크염
    • 여기에 스토어로 이동하는 로직도 추가 가능
fun initViews() {
	WEB_VIEW.webViewClient = object : WebViewClient() {
      override fun shouldOverrideUrlLoading(
          view: WebView?,
          request: WebResourceRequest?
      ): Boolean {
          return shouldOverrideUrlLoading(view, request)
      }
  }
}

fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean
    url?.let {
        if (!URLUtil.isNetworkUrl(url) && !URLUtil.isJavaScriptUrl(url)) {
			// 딥링크로 URI 객체 만들기
            val uri = try {
                Uri.parse(url)
            } catch (e: Exception) {
                return false
            }

            return when (uri.scheme) {
                "intent" -> {
                    startSchemeIntent(it) // Intent 스킴인 경우
                }
                else -> {
                    return try {
                        startActivity(Intent(Intent.ACTION_VIEW, uri)) // 다른 딥링크 스킴이면 실행
                        true
                    } catch (e: java.lang.Exception) {
                        false
                    }
                }
            }
        } else {
            return false
        }
    } ?: return false

/*Intent 스킴을 처리하는 함수*/
fun startSchemeIntent(url: String): Boolean {
    val schemeIntent: Intent = try {
        Intent.parseUri(url, Intent.URI_INTENT_SCHEME) // Intent 스킴을 파싱
    } catch (e: URISyntaxException) {
        return false
    }
    try {
        startActivity(schemeIntent) // 앱으로 이동
        return true
    } catch (e: ActivityNotFoundException) { // 앱이 설치 안 되어 있는 경우
        val packageName = schemeIntent.getPackage()

        if (!packageName.isNullOrBlank()) {
            startActivity(
                Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse("market://details?id=$packageName") // 스토어로 이동
                )
            )
            return true
        }
    }
    return false
}

Uploaded by N2T

'개발 > Android' 카테고리의 다른 글

Android Jetpack security  (0) 2023.07.26
Architecture guide - suggested by Google  (0) 2023.07.26
Pending Intent Basic  (0) 2023.07.25
Android Context  (0) 2023.07.25
Compound View  (0) 2023.07.25