12/08/2018, 15:20

Android - Handling App Links

Khi người dùng click vào một links bất kỳ, ta thường thấy sẽ có một popup hiển thị yêu cầu người dùng sử dụng ứng dụng nào để xử lý link đó. Từ Android 6 trở lên cho phép ứng dụng có thể tự định danh là trình xử lý mặc định cho một loại link nào đó. Nếu người dùng không muốn ứng dụng là trình xử lý ...

Khi người dùng click vào một links bất kỳ, ta thường thấy sẽ có một popup hiển thị yêu cầu người dùng sử dụng ứng dụng nào để xử lý link đó. Từ Android 6 trở lên cho phép ứng dụng có thể tự định danh là trình xử lý mặc định cho một loại link nào đó. Nếu người dùng không muốn ứng dụng là trình xử lý mặc định, thì có thể thay đổi điều này bên trong Settings.

Tự động xử lý liên kết đòi hỏi sự kết hợp giữa nhà phát triển ứng dụng và người phát triển website. Nhà phát triển ứng dụng cần phải cấu hình ứng dụng sao cho nó liên kết với một hay nhiều trang web và yêu cầu hệ thống xác minh liên kết đó. Đầu tiên, người phát triển website sẽ cung cấp xác minh bằng một fileDigital Asset Links - là tập hợp các liên kết phù hợp với Digital Asset protocol, có thể xác minh được các ứng dụng hoặc trang web khác.

Các bước chung để tạo liên kết ứng dụng được xác minh như sau:

  • Khai báo intent filters cho web URIs tại app manifest.
  • Cấu hình ứng dụng để yêu cầu xác minh liên kết.
  • Cung cấp Digital Asset Links JSON file từ website của bạn để xác minh.

Understand URI Request Handling

Tính năng liên kết ứng dụng cho phép ứng dụng của bạn trở thành trình xử lý mặc định cho một số URI được chỉ định, và tất nhiên phải kèm thêm người dùng chưa luawjc chọn ứng dụng mặc định để xử lý URI đó. Khi có một click hoặc môt request đến một liên kết URI trên web, hệ thống Android sẽ sử dụng các tiêu chí sau (thứ tự giảm dần) để thực hiện xử lý yêu cầu:

  • Người dùng đã đặt liên kết ứng dụng: Nếu người dùng đã chỉ định một ứng dụng nào đó để xử lý liên kết, hệ thống sẽ chuyển URI tớ ứng dụng đó để xử lý. Người dùng có thể thiết lập liên kết này theo 2 cách: chọn Always when selecting an app trong hộp thoại chọn app xử lý; Settings > Apps > (gear icon) > App links, chọn ứng dụng để sử dụng. -Người dùng không thiết lập liên kết và có một ứng dụng hỗ trợ: Nếu người dùng không đặt tùy chọn phù hợp với URI yêu cầu và chỉ có một ứng dụng nào xác nhận hỗ trợ cho mẫu URI yêu cầu, hệ thống sẽ chuyển yêu cầu đến ứng dụng đó.
  • Người dùng không thiết lập liên kết, có nhiều ứng dụng hỗ trợ: Nếu có nhiều ứng dụng xác nhận là có xử lý URI yêu cầu, thì một popup sẽ được hiển thị nên yêu cầu người dùng lựa chọn ứng dụng phù hợp để xử lý URI.

Create an Intent Handler for URIs

App links được dựa trên Intent framework, cho phép ứng dụng xử lý các yêu cầu từ hệ thống hoặc từ úng dụng khác.

Để thực hiện xử lý links, sử dụng intent filters, và khai báo những mẫu URI cần xử lý trong app manifest. Ví dụ để xử lý link: http://www.android.com và https://www.android.com bạn cần khai báo như sau:

<activity ...>
    <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:scheme="http" />
        <data android:scheme="https" />
        <data android:host="www.android.com" />
    </intent-filter>
</activity>

như ta thấy intent filters cần khai báo android:scheme có giá trị http, https hoặc cả hai, không được khai báo schemes khác. Và filter cần phải có category là android.intent.action.VIEW và android.intent.category.BROWSABLE.

Manifest sẽ xác định kết nối giữa ứng dụng của bạn và trang web. Tuy nhiên, để hệ thống xử lý ứng dụng của bạn như là trình xử lý mặc định cho một bộ URI, thì bạn cũng phải yêu cầu hệ thống xác minh kết nối này. Phần tiếp theo sẽ giải thích các thực hiện xác minh này.

Request App Links Verification

Ngoài việc sử dụng intent filters để xác định mối liên kết giữa ứng dụng của bạn và trang web, manifest của bạn cũng phải bao gồm một additional declaration để yêu cầu xác minh tự động. Khi có bản khai báo này, hệ thống sẽ cố gắng xác minh ứng dụng của bạn sau khi cài đặt. Nếu quá trình xác minh thành công và người dùng chưa đặt ưu tiên thay thế cho việc xử lý các URI trang web của bạn, thì hệ thống sẽ tự động định hướng các yêu cầu URI đó đến ứng dụng của bạn.

Hệ thống thực hiện xác minh app-link bằng cách so sánh host names trong data của intent filters của app against Digital Asset Links files (assetlinks.json) được lưu trữ trên web domains tương ứng. Để enable xác thực hots, hãy đảm bảo là intent filter đã được khai báo category android.intent.action.VIEW vàandroid.intent.category.BROWSABLE.

Enabling automatic verification

Để enable link handling verification cho ứng dụng của bạn, set thuộc tính android:autoVerify thành true trên ít nhất một URI intent filters trong app manifest:

<activity ...>
 
    <intent-filter android:autoVerify="true">
        <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.android.com" />
        <data android:scheme="https" android:host="www.android.com" />
    </intent-filter>
 
</activity>

Khi thuộc tính android:autoVerifyđược khai báo, cài đặt ứng ụng của bạn sẽ làm cho hệ thống cố gắng xác minh tất cả hosts được kết hợp với các URI trong tất cả intent filters của ứng dụng của bạn. Hệ thống sẽ xử lý ứng dụng của bạn làm trình xử lý mặc định cho mẫu URI đã chỉ định khi nào nó xác minh thành công tất cả các mẫu liên liên kết ứng dụng được khai báo trong manifest.

Supporting app linking for multiple hosts

Hệ thống phải có khả năng xác minh tất cả host được chỉ định trong intent filters against Digital Asset Links files được lưu trữ trên web domains tưng ứng. Nếu bất kỳ xác minh nào fails, ứng dụng không được xác minh là xử lý mặc định cho bất kỳ mẫu URI nào được xác định trong intent filters của app. Ví dụ, một ứng dụng sẽ xác minh fail nếu assetlinks.json file không thể được tìm thấy tại cả hai trang web https://www.example.com/.well-known/assetlinks.json và https://www.example.net/.well-known/assetlinks.json

<application>
 
  <activity android:name=”MainActivity”>
    <intent-filter android:autoVerify="true">
      <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" />
      <data android:scheme="https" android:host="www.example.com" />
    </intent-filter>
  </activity>
  <activity android:name=”SecondActivity”>
    <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:scheme="https" android:host="www.example.net" />
    </intent-filter>
  </activity>
 
</application

Supporting app linking for multiple subdomains

The Digital Asset Links protocol xử lý các subdomains là duy nhất, riêng biệt. Nếu intent filter list bao gồm cả the www.example.com và mobile.example.com subdomains như hosts, bạn phải lưu trữ file assetlink.json trên mỗi subdomains. Ví dụ: ứng dụng sẽ được xác minh thành công khi và chỉ khi có file assetlinks.json trên cả 2 trang web https://www.example.com/.well-known/assetlinks.json và https://mobile.example.com/.well-known/assetlinks.json:

<application>
  <activity android:name=”MainActivity”>
    <intent-filter android:autoVerify="true">
      <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" />
      <data android:scheme="https" android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

Declare Website Associations

Để xác minh liên kết ứng dụng thành công, các trang web phải khai báo các liên kết ứng dụng. Chủ sở hữu trang web sẽ tuyên bố mối quan hệ với một ứng dụng bằng cách lưu trữ một file Digital Asset Links JSON với content-type application/json và với tên là assetlinks.json. File này sẽ được đặt vào following well-known location trên domain:

https://domain[:optional_port]/.well-known/assetlinks.json

Chú ý: Hệ thống xác minh file JSON thông qua giao thức HTTPS được mã hóa. Hãy đảm bảo rằng file lưu trữ của bạn có thể truy cập thông qua kết nối HTTPS, bất kể intent filter có bao gồm https hay không.

A Digital Asset Links JSON file cho biết ứng dụng Android được liên kết với trang web. JSON file sử dụng các trường sau để xác định các ứng dụng liên quan:

  • package_name: Package name được xác định trong manifest.
  • sha256_cert_fingerprints: SHA256 fingerprints của chứng chỉ ký của ứng dụng. Bạn có thể xài lệnh sau để generate the fingerprint thông qua Java keytool:
$ keytool -list -v -keystore my-release-key.keystore

trường này hỗ trợ nhiều fingerprints, nên bạn có thể sử dụng nhiều version khác nhau của app

Ví dụ: file assetlinks.json cung cấp quyền liên kết tới ứng dụng com.example:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Associating a website with multiple apps

Trang web có theer khai báo các liên kết với nhiều ứng dụng trong cùng một file assetlinks.json. Ví dụ file dưới đây cho thấy liên kết với 2 ứng dụng, tách biệt và được lưu trữ tại https://www.example.com/.well-known/assetlinks.json:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "example.com.puppies.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "example.com.monkeys.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Các ứng dụng khác nhau sẽ xử lý liên kết khác nhau với cùng web host. Ví dụ, ứng dụng 1 sẽ khai báo intent filter cho https://example.com/articles, ứng dụng 2 sẽ khai báo intent filters chohttps://example.com/videos.

Chú ý: Nhiều ứng dụng liên kết với một domain có thể có cùng một chứng chỉ hoặc khác nhau.

Associating multiple websites with a single app

Nhiều trang web có thể khai báo liên kết với cùng một ứng dụng trong file assetlinks.json tương ứng. Ví dụ sau sẽ cho thấy trang example.com và example.net liên kết với ứng dụng 1.

Liên kết giữa example.com và ứng dụng 1

https://www.example.com/.well-known/assetlinks.json
 
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Liên kết giữa example.net và ứng dụng 1. Chỉ có dòng đầu tiên chúa URL khác nhau, và đó là khác biệt duy nhất:

https://www.example.net/.well-known/assetlinks.json
 
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Test App Links

Trước khi implement tính năng app link, bạn nên test chức năng liên kết để chắc chắn rằng ứng dụng của bạn được liên kết với trang web, và xử lý URI theo ý muốn.

Để kiếm tra existing statement file,, bạn có thể sử dụng Statement List Generator and Tester tool.

Confirm the list of hosts to verify

Khi thực hiện kiểm tra, bạn nên xác định danh sách host được kết nối mà hệ thống nên xác minh cho ứng dụng của bạn. Tao một danh sách bao gồm tất cả các URI có intent filters tương ứng bao gồm các thuộc tính và phần tử sau:

  • android:scheme: chứa giá trị http hoặc https
  • android:host: chứ giá trị domain URI pattern
  • android.intent.action.VIEW giá trị cho category
  • android.intent.category.BROWSABLE giá trị cho category

Sử dụng danh sách này để kiểm tra một Digital Asset Links JSON file được cung cấp trên mỗi named host và subdomain.

Confirm the Digital Asset Links files

Đối với mỗi trang web, sử dụng Digital Asset Links API để xác nhận thằng Digital Asset Links JSON file được lưu trữ đúng và xác định:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://<domain1>:<port>&
   relation=delegate_permission/common.handle_all_urls

Testing a web URI intent

Khi bạn đã xác nhận danh sách trang web liên kết với ứng dụng của bạn và bạn đã xác nhận file JSON được lưu trữ và hợp lệ, hãy cài đặt ứng dụng lên thiết bị. Hãy chờ ít nhất 20 giây để quá trình xác minh không đồng bộ hoàn tất. Bạn có thể sử dụng lệnh sau để kiểm tra xem liệu hệ thống đã xác minh ứng dụng của và và thiết lập xử lý các liên kết:

adb shell am start -a android.intent.action.VIEW 
    -c android.intent.category.BROWSABLE 
    -d "http://<domain1>:<port>"

Check link policies

Là một phần trong quá trình kiểm tra, bạn có thể kiểm tra cài đặt hệ thống hiện tại để xử lý liên kết. Sử dụng lệnh sau đây để có được danh sách các chính sách xử lý liên kết cho tất cả các ứng dụng:

adb shell dumpsys package domain-preferred-apps
 --or--
adb shell dumpsys package d

Chú ý: Bạn phải đợi ít nhất 20 giây sau khi cài đặt để hệ thống hoàn thành quá trình xác minh.

Lệnh trả về một danh sách user hoặc profile được xác định trên thiết bị:

App linkages for user 0:
Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

Danh sách này cho biết ứng dụng nào được liên kết với domain nào.

-Package: xác định một ứng dụng theo package name được khai báo trong manifest

  • Domains: hiển thị đầy đủ các hosts có liên kết và được xử lý bởi ứng dụng
  • Status: Hiển thị cài đặt xử lý liên kết của ứng dụng này. Một ứng dụng đã xác minh thành công và được khai báoandroid:autoVerify="true"trong manifest, status là always. Số hexadecimal phía sau là hàng có liên quan đến hệ thống, nó không cho biết việc xác minh thành công hay không

Test example

Để xác minh liên kết ứng dụng thành công, hệ thống phải có khả năng xác minh ứng dụng của bạn với tất cả các trang web mà bạn khai bao trong intent filters và đáp ứng các tiêu chí cho các liên kết ứng dụng.

<application>
 
    <activity android:name=”MainActivity”>
        <intent-filter android:autoVerify="true">
            <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" />
            <data android:scheme="https" android:host="mobile.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="http" android:host="www.example2.com" />
        </intent-filter>
    </activity>
 
    <activity android:name=”SecondActivity”>
        <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:scheme="http" android:host="account.example.com" />
        </intent-filter>
    </activity>
 
      <activity android:name=”ThirdActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" android:host="example.com" />
        </intent-filter>
      </activity>
 
</application>

List hots verify

www.example.com
mobile.example.com
www.example2.com
account.example.com

List hots không verify

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an “http” or “https” scheme)
0