URL Scheme

나고수·2022년 1월 16일
0

1일1공부

목록 보기
3/68

앱에서 카카오톡 플러스친구를 웹뷰나 브라우저를 이용하지 않고 바로 카카오톡앱으로 띄우기

  1. 웹페이지에서 하이퍼링크 클릭 시 url scheme이 system에 전달됨
  2. system에서 전달된 url scheme을 보고 실행 가능한 앱이 있는지 확인
  3. 해당 url scheme을 받을 수 있는 앱이 있다면 앱을 실행시키며 이 url을 함께 전달
  4. 앱이 실행되면서 url에 포함된 내용을 참조해서 특정 기능을 수행함

리소스에 어떻게 요청, 접근할 것인지를 명시함.


안드로이드에서는 intent scheme(custom url)을 사용할 수 있다.
package, action, category, component, scheme 등을 지정해서 만들 수 있는 것 같다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val url ="intent://plusfriend/talk/chat/@지그재그#Intent;scheme=kakaoplus;package=com.kakao.talk;end"
        if (url != null && url.startsWith("intent://")) {
            try {
                val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                Log.e("TAGG","$intent")
                //Intent { act=android.intent.action.VIEW //데이터의 URL로 가장 적절한 액티비티를 호출하는 액션
                //dat=kakaoplus://plusfriend/talk/chat/@지그재그 //kakaoplus: 가 scheme이고, 카카오톡이 미리 커스텀해놓은 스킴이다. 
                //pkg=com.kakao.talk } //패키지네임
                val existPackage = intent.getPackage()?.let { this.packageManager.getLaunchIntentForPackage(it) }
                //안드로이드는 packageManager이 폰에 깔린 패키지(앱)을 관리한다.
                //앱에 intent의 패키지 (즉, 카카오톡)이 깔려있는지 확인하는 코드

                //카카오톡이 깔려 있으면 패키지(카카오톡)실행 & 지그재그 플친 오픈
                if (existPackage != null) {
                    startActivity(this, intent,null)
                }
                //키키오톡이 깔려 있지 않으면 마켓에서 카카오톡 검색
                else {
                    val marketIntent = Intent(Intent.ACTION_VIEW);
                    marketIntent.data = Uri.parse("market://details?id=" + intent.getPackage()) //스토어에서 카카오톡을 검색하도록 하는 intent
                    startActivity(this, marketIntent,null);
                }
                return
            } catch (e: Exception) {
                e.printStackTrace()
            }
        } else if (url != null && url.startsWith("market://")) {
            try {
                val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                if (intent != null) {
                    startActivity(this,intent,null);
                }
                return ;
            } catch (e: URISyntaxException) {
                e.printStackTrace();
            }
        }
    }
//안드로이드 11 이상부터는 이 코드를 manifest에 넣어줘야한다고 한다.
//https://developer.android.com/about/versions/11/privacy/package-visibility?hl=ko
<queries>
 <package android:name="com.kakao.talk" />
</queries>

삽질 :
https://pf.kakao.com/_xexkxcxkl
위 링크는 브랜디 카카오톡 플러스친구 링크이다.
처음에는 intent scheme 'intent://plusfriend/talk/chat/@지그재그' 중 @뒤에 '_xexkxcxkl'<<이것을 넣어야 하는 줄 알았다. 저게 카카오에서 부여한 채널별 아이디 인 줄 알았음.
근데 저게 아니라 카카오톡에서 실제로 고객이 검색할 때 사용하는 이름 즉, 한글로 '브랜디', '지그재그' 이걸 입력하는 거였다. 🥲

profile
되고싶다

0개의 댓글