04/11/2019, 20:51

Deeplink đến Dynamic link trong Android - Những điều cần biết

Đã bao giờ bạn nhấn vào một đường link mà sau đó một ứng dụng khác được mở lên chưa, hoặc bạn hay thấy mọi người chia sẻ link để từ đó có thể tải ứng dụng về ? Hẳn có lúc bạn đã làm, đã thấy phải không nào. Vậy họ làm như thế nào nhỉ ? Câu trả lời chính là sử dụng Deeplink đó. Sau đây ...

Đã bao giờ bạn nhấn vào một đường link mà sau đó một ứng dụng khác được mở lên chưa, hoặc bạn hay thấy mọi người chia sẻ link để từ đó có thể tải ứng dụng về ? Hẳn có lúc bạn đã làm, đã thấy phải không nào. Vậy họ làm như thế nào nhỉ ? ????????

Câu trả lời chính là sử dụng Deeplink đó. Sau đây chúng ta cùng tìm hiểu nhé !!!

I. Khái niệm

1. Deep link là gì ?

Là thành phần giúp di chuyển giữa web và ứng dụng. Chúng đơn giản là URL mà giúp di chuyển tới thành phần nào đó của ứng dụng.

Tuy nhiên nếu ứng dụng khác trong thiết bị có thể xử lý cùng loại Intent, thì người dùng có thể sẽ không đi thẳng đến app.

Có một khái niệm khác là App link. Nó cũng chính là deep link mà đã được xác thực là thuộc về app của mình. Khi nhấn vào URL, nó sẽ mở luôn app, không hiển thị dialog chọn ứng dụng

2. Kịch bản từ Deep link tới nội dung app

Khi click một URl, hệ thống Android sẽ làm từng bước sau, theo tuần tự, cho đến khi thành công

  • Mở ứng dụng mặc định theo setting của người dùng có thể xử lý URL, nếu được chỉ định

  • Mở ứng dụng duy nhất có thể xử lý URL

  • Cho phép người dùng chọn ứng dụng từ dialog

3. App link vs deep link

App link sẽ dẫn người dùng thẳng vào app mà không hiện dialog như trên

Cách làm

  • Set android:autoVerify="true"
  • Sẽ xác thực toàn bộ host liên kết với URL

Check toàn bộ intent filter bao gồm

Action: android.intent.action.VIEW

Categories: android.intent.category.BROWSABLE và android.intent.category.DEFAULT

Data scheme: http or https

Giả sử tìm được thì sẽ check file Digital Asset Links

Digital Asset Links phải có ở trên website để chỉ thị app liên kết với website và xác thực URL intent

4. Tạo deeplink và Lấy parameter

Mình sẽ truyền id và name theo 2 cách sau

Sử dụng câu lệnh cmd

adb shell 'am start 
-W -a android.intent.action.VIEW 
-d "http://www.testapp.com/main?id=12345&name=Trung" 
gooner.demo.training_deep_link'

Sử dụng file html

<a href="test://gooner.demo/main?/id=12345&name=Trung">Open APP</a>

File html

Giao diện web

Code để lấy, trong onCreate hoặc onStart

        val data = intent?.data.let {
            Log.d("Data11", " " + it?.getQueryParameter("id"))
            Log.d("Data11", " " + it?.getQueryParameter("name"))
        }

5. Tương tác với deeplink

a. Deeplink không ở trong nội dung trang web

  • Nếu link không ở trong nội dung của 1 trang web: sẽ xuất hiện dialog chọn app

Sau đó nhấn app của mình sẽ mở app lên

b. Trường hợp link được đính trong nội dung trang web

  • Có app: mở app

  • Không có: app không được mở lên, không có gì xảy ra khi nhấn vào deeplink

Các bạn để lại ý kiến phần này nhé, mình thử nhiều lúc kết quả không dk như trên. Mong có sự góp ý của các bạn ????????????

6. Deeplink với Navigation Component

a. Một số vấn đề khi sử dụng deeplink như sau:

1. Phải tạo nhiều link ở file manifest, bao gồm cả http và https

2. Xử lý parameters trong link

Case 1

val myUri = Uri.parse(myLink) // http://mysite.com?myParam=VALUE
val myParamValue = myUri.getQueryParameter("myParam")

Case 2

val myUri = Uri.parse(myLink) // http://mysite.com/VALUE/stuff
val myParamValue = myUri.pathSegments[0]

3. Xử lý di chuyển màn khi mở link

Navigation sẽ giúp khắc phục các vấn đề này

<fragment
    android:id="@+id/pagesListFragment"
    android:name="com.ekalips.navigatortest.pages.PagesListFragment"
    android:label="Pages"
    tools:layout="@layout/fragment_pages_list">
    <action
        android:id="@+id/viewPage"
        app:destination="@id/pageFragment"/>
    <deepLink app:uri="myapp.com" />
</fragment>

URI ko có scheme => Schema sẽ được coi là http hay https

<fragment
    android:id="@+id/pageFragment"
    android:name="com.ekalips.navigatortest.page.PageFragment"
    android:label="Page"
    tools:layout="@layout/fragment_page">
    <argument
        android:name="title"
        app:type="string" />

    <argument
        android:name="detail"
        app:type="string" />

    <action
        android:id="@+id/viewPageComments"
        app:destination="@id/pageCommentsFragment"/>
    <deepLink app:uri="myapp.com/{title}/{detail}" />
</fragment>

Các tham số được viết trong dấu {} và thẻ <argument>. Muốn nhận ta đơn giản chỉ cần gọi getArguments() rồi get ra thuộc tính là xong

Có thể sử dụng Safe Args để tiện cho việc lấy dữ liệu

  1. Về cơ bản nó sẽ lấy theo file navigation graph ta tạo ra (tùy theo loại deep link), từ đó đơn giản hóa việc tạo di chuyển

b. Phân loại

Có 2 loại deep link:

  • Explicit: sử dụng PendingIntent, thường dùng trong notification, app widget

  • Implicit: sử dụng URI, khi nhấn vào thì mở apps

7. DynamicLink của Firebase

a. Khái niệm

DynamicLink FireBase là các link liên kết hoạt động theo cách bạn muốn, nó sử dụng được trên nhiều nền tảng (iOS, Android, Web) và cho dù ứng dụng của bạn đã được cài đặt hay chưa.

Có thể tạo bằng cách sử dụng Firebase console, REST API, iOS hoặc Android Builder API, hoặc thêm tham số Dynamic Link tới domain của app.

Lợi ích:

  • Có thể làm tăng lượt người sử dụng app từ web

  • Quảng cáo đơn giản hơn, chỉ cần gửi link là được

  • Chia sẻ nội dung của app dễ hơn, trên bất kì nền tảng nào, hay đã dùng app hay chưa

Cách hoạt động

b. Hoạt động trong các trường hợp

  • Firebase deeplink cần có internet mới có thể hoạt động, ko sẽ báo lỗi

  • Nếu có app thì sẽ mở app

  • Ko có app thì ta sẽ có thể chỉ định dẫn tới google play store hoặc link mà ta muốn

c. Cách khởi tạo

  • Sử dụng Firebase console: đơn giản, với mục đích để test hoặc cho đội marketing dễ quảng cáo app
  • Trong code
    fun generateContentLink(): String {
        val baseUrl = Uri.parse("https://gooner.demo/test/?title=Happy-to-meet-you")
        val domain = "https://gooner.page.link"

        val link = FirebaseDynamicLinks.getInstance()
            .createDynamicLink()
            // deep link
            .setLink(baseUrl)
            // dynamic link
            .setDomainUriPrefix(domain)
            .setAndroidParameters(
                DynamicLink.AndroidParameters.Builder("gooner.demo.training_deep_link")
                    .setFallbackUrl(Uri.parse("https://gooner.demo/test/?title=Can't-install-on-device")).build()
            )
            .setIosParameters(DynamicLink.IosParameters.Builder("gooner.demo.iOS").build())
            .buildDynamicLink()

        return link.uri.toString()

    }

d. So sánh

  • Dynamic Link vs Deep Link

Dynamic link bao gồm cả deeplink + một số thông tin khác như package name, version, link khi không cài được app (afl), ...

So sánh

  • Long vs short dynamic link
  • Long: chứa đầy đủ thông tin như package android, ios, parameter

  • Short: link rút gọn, che giấu đi thông tin

Long Dynamic Link

https://gooner.page.link/?link=https://gooner.demo/main/?title%3DHappy-to-meet-you-kaka11111&apn=gooner.demo.training_deep_link

Short Dynamic Link

https://gooner.page.link/main 

Trong code gen ra bằng buildDynamicLink()buildShortDynamicLink()

II. Code

1. Code deep link cơ bản

  • Thêm <action> ACTION_VIEW: để intent filter có thể tìm từ Google Search
  <action android:name="android.intent.action.VIEW"/>
  • Thêm thẻ <data>
 <data android:scheme="http"
                      android:host="www.example.com"/>

 <data android:scheme="app"
                      android:host="open.my.app"
                      android:pathPrefix="/main"/>
  • Thêm thẻ <category>
// Để có thể mở app từ trình duyệt

<category android:name="android.intent.category.BROWSABLE"/>

// Mở app từ implicit intent, nếu đúng component name thì app có thể được mở 

<category android:name="android.intent.category.DEFAULT"/>

Cùng 1 activity có thể có nhiều intent filter với thẻ <data> khác nhau

<activity
    android:name="com.example.android.GizmosActivity"
    android:label="@string/title_gizmos" >
    <intent-filter android:label="@string/filter_view_http_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
         
        <data android:scheme="http"
              android:host="www.example.com"
              android:pathPrefix="/gizmos" />
         
    </intent-filter>
    <intent-filter android:label="@string/filter_view_example_gizmos">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
         
        <data android:scheme="example"
              android:host="gizmos" />
    </intent-filter>
</activity>

Và nếu viết như trên thì chỉ có https://www.example.com và app://open.my.app là có thể dẫn tới app

Nếu viết như sau

<intent-filter>
  ...
  <data android:scheme="https" android:host="www.example.com" />
  <data android:scheme="app" android:host="open.my.app" />
</intent-filter>

Thì sẽ tạo ra 4 URL có thể dẫn tới app.

Deeplink có rất nhiều ứng dụng trong thực tế, đặc biệt trong việc quảng cáo, quảng bá sản phẩm. Qua bài viết các bạn cũng thấy cũng khá dễ làm, dễ học phải không nào. Vậy còn chần chừ gì nữa mà không thử ngay thôi ????????????

Xem thêm các bài viết khác của mình tại Viblo

  • Service trong Android - Những khái niệm cơ bản
  • Location trong Android
  • App bundle và Dynamic delivery trong Android

Ngoài ra, nếu bạn muốn viết một blog, chạy một trang web thì host là một phần không thể thiếu, bên cạnh domain. Hawkhost là một host rất tốt, được nhiều người sử dụng, server ổn định, support nhiệt tình, nhiều khuyến mại nữa. Mình cũng đang sử dụng cho blog của mình - đang trong giai đoạn phát triển ???? .

Các bạn có thể xem thêm và đăng kí tại link:

  • Hawkhost - một host rất đáng để sử dụng
0