URL Scheme

지프치프·2022년 12월 1일
0

Android

목록 보기
58/86
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


개요

URL이란 웹에서 http나 https로 시작하는 주소를 입력하면
특정 서비스의 웹페이지로 이동한다.
앱에도 이러한 기능이 있는데 이를 딥 링크(Deep Link)라고 한다.
딥 링크에는 아래의 3가지가 있다.

  • URL Scheme
  • App Link (Android)
  • Universal Link (IOS)

URL Scheme

URL Scheme는 딥 링크 방식 중에서 가장 보편적으로 사용되며
Android와 IOS 모두 사용이 가능하다.

scheme://host

방식을 사용하는데 여기서
scheme는 앱의 이름,
host는 이동할 페이지(액티비티) 를 의미한다.

사용해보자

AndroidMenifest 등록

다른 앱에서 호출할 수 있도록 AndroidManifest
URL Scheme를 등록해주자

        <activity android:name=".view.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data
                    android:host="main"
                    android:scheme="zxingsample" />
            </intent-filter>

각 Activity마다 Intent-filter를 등록함으로써
URL Scheme를 생성할 수 있다.
이 Activity의 URL Scheme는 zxingsample://main이 된다.

호출

다른 샘플 앱에서 위에서 등록한 대로 앱을 호출해보록 하겠다.

            btnGoZxing.setOnClickListener {
                val scheme = "zxingsample://main"
                val intent = Intent()
                intent.setData(Uri.parse(scheme))
                startActivity(intent)
            }

웹 URL을 호출하는 방법과 똑같이 사용하면 된다.

예외처리

만약 호출하려는 앱이 단말기에 설치가 안되어있다면
ActivityNotFoundException가 발생한다.
그렇기 때문에 앱이 설치가 되어있지 않다면 마켓에서 설치할 수 있도록
예외처리를 해주면 더욱 좋다.
네이버지도로 테스트코드를 작성해보았다.

                val scheme = "nmap://map?&appname=com.jeepchief.urlshcemesample"
                val intent = Intent()
                intent.setData(Uri.parse(scheme))
                try {
                    startActivity(intent)
                } catch (e: ActivityNotFoundException) {
                    startActivity(Intent(
                        Intent.ACTION_VIEW,
                        Uri.parse("market://details?id=com.nhn.android.nmap")
                    ))
                }

위와 같이 예외처리를 작성해주면
설치되지 않은 앱일 때 마켓 내에서 해당 앱의 페이지로 이동시켜준다.

사실 URL Scheme에는 한계점이 존재하는데
바로 중복된 URL Scheme가 존재할 수 있다는 것이다.
이를테면 Play 스토어는 market:// 이라는 scheme를 가지는데
다른 스토어들(원스토어, 갤럭시 스토어 등)도 대부분 market:// 이라는 scheme를 가지고 있어서 이럴 경우 의도했던 앱으로 바로 이동이 되지 않고
chooser를 통해 이동할 앱을 선택해야 한다.

그래서 이를 개선하기 위해 App Link이다.
IOS에도 Universal Link라고 하는 개선판이 있다.

App Link에 대해서는 다음 포스팅에서 다뤄보도록 하겠다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글