본문 바로가기

안드로이드

[And] navigation #2 - 딥 링크

반응형

네비게이션 딥링크

네비게이션에서는
외부에서 발생하고 url 을 이용한 암시적 딥링크,
알림이나 위젯등 내부에서 발생하고 PendingIntent 을 이용한 명시적 딥링크
두 가지가 존재한다.

1. 암시적 딥링크

딥링크 생성하기

암시적 딥링크는 네비게이션 툴에서 추가 할 수 있으며,

<fragment
    android:id="@+id/fragment121"
    android:name="com.onetwothree.navigationsample.Fragment121"
    android:label="Fragment121">
    <deepLink
        android:id="@+id/deepLink2"
        app:uri="page/fragment121" />
</fragment>

코드로는 위와 같이 작성하면 추가가 가능하다.

 

위의 경우는 fragment121 화면으로 이동하기 위해 "page/fragment121" 라는 딥링크를 설정하였다.
네비게이션의 딥링크는 앞에 scheme ( http, https ) 을 자동으로 붙여준다.

 

주의 할 점은 "app://page/fragment121" 식으로 작성한다고 "app" 이 scheme 으로 설정되지는 않는다.
scheme 은 무조건 http 아니면 https 이다.

변수 넘기기

딥링크 생성시에 "page/fragment121/{id}/{name}" 과 같은 방식으로 url을 수정하면 변수를 넘길 수 있다.

 

내가 넘긴 값과 함께 "android-support-nav:controller:deepLinkIntent" 란 키로 해당 딥링크에 대한 정보가 같이 내려온다.

딥링크 연결하기

<application

    ...

    <activity android:name=".MainActivity">

        ...

        <nav-graph android:value="@navigation/nav_graph" />
    </activity>
</application>

딥링크가 있는 네비게이션 그래프를 위와 같은 방법으로 manifest 에 코드를 작성해주면 별 다른 설정없이 연결이 가능하다.

테스트 하기

adb shell am start -a android.intent.action.VIEW -d "http://page/fragment121" com.onetwothree.navigationsample

딥링크가 적용된 앱을 설치 후 터미널에서 테스트 해볼 수 있다.

 

"http://page/fragment121" 는 딥링크 주소

com.onetwothree.navigationsample 는 앱의 pacakge 명이다.

 

결과로 fragment121 화면이 열리는 것을 확인 할 수 있다.
대신 네비게이션 그래프안에 존재하는 모든 스택을 쌓아주진 않고 시작점만 스택에 들어온다.

( 뒤로 가면 네비게이션의 시작 부분으로 이동 )

2. 명시적 딥링크

명시적 딥링크는 위와 같이 알림을 눌러서 원하는 화면으로 가거나, 위젯등에서 앱을 열 필요가 있을 때 사용하면 된다.

사용하기

val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.fragment121)
    .createPendingIntent()

val pendingIntent = findNavController().createDeepLink()
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.fragment121)
    .createPendingIntent()

명시적 딥링크 생성에는 NavDeepLinkBuilder, NavController.createDeepLink 두 가지 방법이 있다.

 

graph, destination 만 설정해주면 원하는 대로 동작하는 것을 볼 수 있다.
만얀, graph 안에 존재하지 않는 destination 을 설정하면 에러가 나니 주의해야 한다.

반응형