커스텀 스킴

…And More

Android 웹뷰에서 딥링크 열기
- manifest에 패키지 등록
<queries>
<package android:name="com.kakao.talk" /> <!--카카오톡-->
<package android:name="com.shcard.smartpay" /> <!--신한페이판-->
</queries>
- 필요한 액션을 발생시킬 페이지를 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