Xác minh Đường liên kết trong ứng dụng Android

Đường liên kết trong ứng dụng Android là một loại đường liên kết sâu đặc biệt cho phép URL trên trang web của bạn mở ngay nội dung tương ứng trong ứng dụng Android mà không yêu cầu người dùng chọn ứng dụng. Đường liên kết trong ứng dụng Android sử dụng Digital Asset Links API (API Đường liên kết đến tài sản kỹ thuật số) để thiết lập niềm tin rằng ứng dụng của bạn đã được trang web phê duyệt tự động mở đường liên kết cho miền đó. Nếu xác minh thành công rằng bạn sở hữu các URL đó, thì hệ thống sẽ tự động chuyển các ý định URL đó đến ứng dụng của bạn.

Để xác minh rằng bạn sở hữu cả ứng dụng và URL của trang web, hãy hoàn tất các bước sau:

  1. Thêm bộ lọc ý định chứa thuộc tính autoVerify. Thuộc tính này báo hiệu cho hệ thống biết rằng cần xác minh xem ứng dụng của bạn có thuộc về các miền URL dùng trong bộ lọc ý định hay không.

  2. Khai báo mối liên kết giữa trang web và bộ lọc ý định bằng cách lưu trữ tệp JSON chứa Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) tại vị trí sau:

    https://domain.name/.well-known/assetlinks.json

Bạn có thể tìm thấy thông tin liên quan trong các tài nguyên sau:

Thêm bộ lọc ý định để xác minh đường liên kết ứng dụng

Để bật tính năng xác minh xử lý đường liên kết cho ứng dụng của bạn, hãy thêm các bộ lọc ý định khớp với định dạng sau:

<!-- Make sure you explicitly set android:autoVerify to "true". -->
<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" />

    <!-- If a user clicks on a shared link that uses the "http" scheme, your
         app should be able to delegate that traffic to "https". -->
    <data android:scheme="http" />
    <data android:scheme="https" />

    <!-- Include one or more domains that should be verified. -->
    <data android:host="..." />
</intent-filter>

Mặc dù chỉ cần đưa autoVerify vào một phần khai báo <intent-filter> cho mỗi máy chủ lưu trữ là đủ, ngay cả khi ứng dụng lưu trữ đó được dùng cho các nội dung khai báo khác chưa được đánh dấu, bạn vẫn nên thêm autoVerify vào từng phần tử <intent-filter> để đảm bảo tính nhất quán. Điều này cũng đảm bảo rằng sau khi bạn xoá hoặc tái cấu trúc các phần tử trong tệp kê khai, ứng dụng của bạn vẫn liên kết với tất cả các miền mà bạn vẫn xác định.

Quy trình xác minh miền yêu cầu kết nối Internet và có thể mất chút thời gian để hoàn tất. Để giúp cải thiện hiệu quả của quy trình, hệ thống sẽ xác minh miền cho một ứng dụng nhắm đến Android 12 trở lên chỉ khi miền đó nằm trong phần tử <intent-filter> chứa định dạng chính xác được chỉ định trong đoạn mã trước đó.

Hỗ trợ liên kết ứng dụng cho nhiều máy chủ

Hệ thống phải xác minh được máy chủ lưu trữ được chỉ định trong phần tử dữ liệu của bộ lọc ý định URL của ứng dụng dựa trên các tệp Đường liên kết đến tài sản kỹ thuật số được lưu trữ trên các miền web tương ứng trong bộ lọc ý định đó. Nếu xác minh không thành công, thì theo mặc định, hệ thống sẽ mặc định thực hiện hành vi chuẩn để phân giải ý định, như mô tả trong phần Tạo đường liên kết sâu đến nội dung ứng dụng. Tuy nhiên, bạn vẫn có thể xác minh ứng dụng là một trình xử lý mặc định cho mọi mẫu URL được xác định trong các bộ lọc ý định khác của ứng dụng.

Lưu ý: Trên Android 11 (API cấp 30) trở xuống, hệ thống sẽ không xác minh ứng dụng của bạn là trình xử lý mặc định trừ phi tìm thấy một tệp Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) trùng khớp cho tất cả máy chủ lưu trữ mà bạn xác định trong tệp kê khai.

Ví dụ: một ứng dụng có các bộ lọc ý định sau đây sẽ chỉ vượt qua quy trình xác minh cho https://www.example.com nếu tệp assetlinks.json được tìm thấy tại https://www.example.com/.well-known/assetlinks.json chứ không phải tại 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" />
      <data android:scheme="https" />
      <data 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" />
     <data android:host="www.example.net" />
    </intent-filter>
  </activity>

</application>

Lưu ý: Tất cả các phần tử <data> trong cùng một bộ lọc ý định đều được hợp nhất với nhau để tính đến tất cả biến thể của các thuộc tính kết hợp của những phần tử đó. Ví dụ: bộ lọc ý định đầu tiên ở trên bao gồm phần tử <data> chỉ khai báo lược đồ HTTPS. Tuy nhiên, thành phần này được kết hợp với phần tử <data> khác để bộ lọc ý định hỗ trợ cả http://www.example.comhttps://www.example.com. Do đó, bạn phải tạo các bộ lọc ý định riêng biệt khi muốn xác định các tổ hợp cụ thể của giao thức và miền URI.

Hỗ trợ liên kết ứng dụng cho nhiều miền con

Giao thức Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) coi miền con trong bộ lọc ý định là các máy chủ riêng biệt và riêng biệt. Vì vậy, nếu bộ lọc ý định của bạn liệt kê nhiều máy chủ có miền con khác nhau, thì bạn phải phát hành một assetlinks.json hợp lệ trên mỗi miền. Ví dụ: bộ lọc ý định sau đây bao gồm www.example.commobile.example.com là máy chủ lưu trữ URL có ý định được chấp nhận. Vì vậy, một assetlinks.json hợp lệ phải được phát hành ở cả https://www.example.com/.well-known/assetlinks.jsonhttps://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="https" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
      <data android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

Ngoài ra, nếu khai báo tên máy chủ bằng một ký tự đại diện (chẳng hạn như *.example.com), bạn phải phát hành tệp assetlinks.json tại tên máy chủ gốc (example.com). Ví dụ: ứng dụng có bộ lọc ý định sau đây sẽ vượt qua quy trình xác minh cho mọi tên phụ của example.com (chẳng hạn như foo.example.com) miễn là tệp assetlinks.json được xuất bản tại https://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="https" />
      <data android:host="*.example.com" />
    </intent-filter>
  </activity>
</application>

Kiểm tra nhiều ứng dụng liên kết với cùng một miền

Nếu bạn phát hành nhiều ứng dụng, trong đó mỗi ứng dụng được liên kết với cùng một miền, thì các ứng dụng đó có thể được xác minh thành công. Tuy nhiên, nếu các ứng dụng có thể phân giải cùng một máy chủ lưu trữ miền và đường dẫn, như trường hợp với các phiên bản rút gọn và đầy đủ của một ứng dụng, thì chỉ ứng dụng được cài đặt gần đây nhất mới có thể phân giải ý định web cho miền đó.

Trong trường hợp này, hãy kiểm tra các ứng dụng xung đột có thể xảy ra trên thiết bị của người dùng, miễn là bạn có chế độ hiển thị gói cần thiết. Sau đó, trong ứng dụng của bạn, hãy hiển thị hộp thoại bộ chọn tuỳ chỉnh có chứa kết quả từ việc gọi queryIntentActivities(). Người dùng có thể chọn ứng dụng họ muốn trong danh sách các ứng dụng phù hợp xuất hiện trong hộp thoại.

Khai báo mối liên kết với trang web

Bạn phải xuất bản tệp JSON Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) trên trang web của mình để cho biết các ứng dụng Android được liên kết với trang web và xác minh ý định URL của ứng dụng. Tệp JSON sử dụng các trường sau để xác định ứng dụng liên kết:

  • package_name: Mã ứng dụng được khai báo trong tệp build.gradle của ứng dụng.
  • sha256_cert_fingerprints: Vân tay số SHA256 của chứng chỉ ký ứng dụng. Bạn có thể dùng lệnh sau để tạo vân tay số thông qua công cụ chính Java:
    keytool -list -v -keystore my-release-key.keystore
    
    Trường này hỗ trợ nhiều vân tay số, có thể dùng để hỗ trợ nhiều phiên bản của ứng dụng, chẳng hạn như các bản gỡ lỗi và bản phát hành chính thức.

    Nếu bạn đang sử dụng Tính năng ký ứng dụng của Play cho ứng dụng, thì vân tay số của chứng chỉ được tạo bằng cách chạy keytool cục bộ thường sẽ không khớp với vân tay số trên thiết bị của người dùng. Bạn có thể xác minh xem mình có đang sử dụng Tính năng ký ứng dụng của Play cho ứng dụng của mình hay không trong tài khoản nhà phát triển trên Play Console tại Release > Setup > App signing. Nếu có, bạn cũng sẽ thấy đoạn mã JSON chính xác của Đường liên kết đến tài sản kỹ thuật số cho ứng dụng của mình trên cùng một trang.

Tệp assetlinks.json ví dụ sau đây cấp quyền mở đường liên kết cho một ứng dụng Android 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"]
  }
}]

Liên kết một trang web với nhiều ứng dụng

Một trang web có thể khai báo các mối liên kết với nhiều ứng dụng trong cùng một tệp assetlinks.json. Trang thông tin tệp sau đây cho thấy ví dụ về tệp câu lệnh khai báo mối liên kết với hai ứng dụng (một cách riêng biệt) và nằm tại https://www.example.com/.well-known/assetlinks.json:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.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": "com.example.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 có thể xử lý đường liên kết đến những tài nguyên khác nhau trong cùng một máy chủ lưu trữ web. Ví dụ: app1 có thể khai báo bộ lọc ý định cho https://example.com/articles và app2 có thể khai báo bộ lọc ý định cho https://example.com/videos.

Lưu ý: Nhiều ứng dụng liên kết với một miền có thể được ký bằng cùng một hoặc khác chứng chỉ.

Liên kết nhiều trang web bằng một ứng dụng

Nhiều trang web có thể khai báo các mối liên kết với cùng một ứng dụng trong các tệp assetlinks.json tương ứng. Các danh sách tệp sau đây là một ví dụ về cách khai báo mối liên kết giữa example.com và example.net với app1. Trang thông tin đầu tiên cho thấy mối liên kết giữa example.com với app1:

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"]
  }
}]

Trang thông tin tiếp theo cho thấy mối liên kết giữa example.net với app1. Chỉ có vị trí lưu trữ các tệp này là khác nhau (.com.net):

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"]
  }
}]

Phát hành tệp xác minh JSON

Bạn phải phát hành tệp xác minh JSON tại vị trí sau:

https://domain.name/.well-known/assetlinks.json

Hãy chắc chắn những điều sau:

  • Tệp assetlinks.json được phân phát với loại nội dung application/json.
  • Tệp assetlinks.json phải truy cập được qua kết nối HTTPS, bất kể bộ lọc ý định của ứng dụng có khai báo HTTPS là lược đồ dữ liệu hay không.
  • Tệp assetlinks.json phải truy cập được mà không có lệnh chuyển hướng nào (không có lệnh chuyển hướng 301 hoặc 302).
  • Nếu đường liên kết đến ứng dụng của bạn hỗ trợ nhiều miền lưu trữ, thì bạn phải phát hành tệp assetlinks.json trên từng miền. Xem phần Hỗ trợ tính năng liên kết ứng dụng cho nhiều máy chủ.
  • Không phát hành ứng dụng bằng URL dành cho nhà phát triển/kiểm thử trong tệp kê khai có thể không truy cập được công khai (chẳng hạn như bất kỳ URL nào chỉ truy cập được bằng VPN). Giải pháp trong những trường hợp như vậy là định cấu hình các biến thể bản dựng để tạo một tệp kê khai khác cho các bản dựng của nhà phát triển.

Xác minh Đường liên kết trong ứng dụng Android

Khi android:autoVerify="true" có trong ít nhất một trong các bộ lọc ý định của ứng dụng, việc cài đặt ứng dụng trên một thiết bị chạy Android 6.0 (API cấp 23) trở lên sẽ khiến hệ thống tự động xác minh máy chủ lưu trữ liên kết với các URL trong bộ lọc ý định của ứng dụng. Trên Android 12 trở lên, bạn cũng có thể gọi quy trình xác minh theo cách thủ công để kiểm thử logic xác minh.

Xác minh tự động

Quy trình xác minh tự động của hệ thống bao gồm những việc sau:

  1. Hệ thống sẽ kiểm tra mọi bộ lọc ý định có chứa bất kỳ nội dung nào sau đây:
    • Hành động: android.intent.action.VIEW
    • Danh mục: android.intent.category.BROWSABLEandroid.intent.category.DEFAULT
    • Lược đồ dữ liệu: http hoặc https
  2. Đối với mỗi tên máy chủ riêng biệt có trong các bộ lọc ý định ở trên, Android sẽ truy vấn các trang web tương ứng cho tệp Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) tại https://hostname/.well-known/assetlinks.json.

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

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

Xác minh thủ công

Kể từ Android 12, bạn có thể gọi quy trình xác minh miền theo cách thủ công cho một ứng dụng đã cài đặt trên thiết bị. Bạn có thể thực hiện quá trình này bất kể ứng dụng của bạn có nhắm đến Android 12 hay không.

Thiết lập kết nối Internet

Để xác minh miền, thiết bị thử nghiệm của bạn phải kết nối với Internet.

Hỗ trợ quy trình xác minh miền đã cập nhật

Nếu ứng dụng của bạn nhắm đến Android 12 trở lên, thì hệ thống sẽ tự động sử dụng quy trình xác minh miền đã cập nhật.

Nếu không, bạn có thể bật quy trình xác minh đã cập nhật theo cách thủ công. Để thực hiện việc này, hãy chạy lệnh sau trong cửa sổ dòng lệnh:

adb shell am compat enable 175408749 PACKAGE_NAME

Đặt lại trạng thái của Đường liên kết trong ứng dụng Android trên thiết bị

Trước khi gọi quy trình xác minh miền theo cách thủ công trên thiết bị, bạn phải đặt lại trạng thái của Đường liên kết trong ứng dụng Android trên thiết bị thử nghiệm. Để thực hiện việc này, hãy chạy lệnh sau trong cửa sổ dòng lệnh:

adb shell pm set-app-links --package PACKAGE_NAME 0 all

Lệnh này đặt thiết bị về cùng trạng thái với thiết bị trước khi người dùng chọn ứng dụng mặc định cho bất kỳ miền nào.

Gọi quá trình xác minh miền

Sau khi đặt lại trạng thái của Đường liên kết trong ứng dụng Android trên thiết bị, bạn có thể tự xác minh. Để thực hiện điều này, hãy chạy lệnh sau trong cửa sổ dòng lệnh:

adb shell pm verify-app-links --re-verify PACKAGE_NAME

Xem kết quả xác minh

Sau khi cho nhân viên hỗ trợ xác minh hoàn tất các yêu cầu của mình, hãy xem lại kết quả xác minh. Để làm như vậy, hãy chạy lệnh sau:

adb shell pm get-app-links PACKAGE_NAME

Kết quả của lệnh này sẽ tương tự như sau:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

Các miền vượt qua quy trình xác minh thành công sẽ có trạng thái xác minh miền là verified. Nếu có trạng thái nào khác thì không thể thực hiện quy trình xác minh miền. Cụ thể, trạng thái none cho biết tác nhân xác minh có thể chưa hoàn tất quy trình xác minh.

Danh sách sau đây cho thấy các giá trị trả về có thể có mà phương thức xác minh miền có thể trả về cho một miền nhất định:

none
Chưa có dữ liệu nào được ghi lại cho miền này. Hãy chờ thêm vài phút để tác nhân xác minh hoàn tất các yêu cầu liên quan đến việc xác minh miền, sau đó gọi lại quy trình xác minh miền.
verified
Miền đã được xác minh thành công cho ứng dụng khai báo.
approved
Miền bị buộc phê duyệt, thường bằng cách thực thi lệnh shell.
denied
Miền bị buộc từ chối, thường bằng cách thực thi lệnh shell.
migrated
Hệ thống giữ nguyên kết quả của quy trình trước đó sử dụng quy trình xác minh miền cũ.
restored
Miền được phê duyệt sau khi người dùng khôi phục dữ liệu. Hệ thống giả định rằng miền này đã được xác minh trước đó.
legacy_failure
Miền bị trình xác minh cũ từ chối. Lý do lỗi cụ thể hiện chưa được xác định.
system_configured
Miền được cấu hình thiết bị phê duyệt tự động.
Mã lỗi 1024 trở lên

Mã lỗi tuỳ chỉnh dành riêng cho trình xác minh của thiết bị.

Kiểm tra kỹ để đảm bảo rằng bạn đã thiết lập kết nối mạnggọi lại quy trình xác minh miền.

Yêu cầu người dùng liên kết ứng dụng của bạn với miền

Một cách khác để ứng dụng được phê duyệt đối với một miền là yêu cầu người dùng liên kết ứng dụng với miền đó.

Kiểm tra xem ứng dụng của bạn đã được phê duyệt cho miền hay chưa

Trước khi bạn nhắc người dùng, hãy kiểm tra xem ứng dụng của bạn có phải là trình xử lý mặc định cho các miền mà bạn xác định trong phần tử <intent-filter> hay không. Bạn có thể truy vấn trạng thái phê duyệt bằng một trong các phương thức sau:

Trình quản lý xác minh miền

Đoạn mã sau đây minh hoạ cách sử dụng API DomainVerificationManager:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the user
// has associated with an app.
val selectedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

Java

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user has
        // associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

Chương trình dòng lệnh

Khi kiểm thử ứng dụng trong quá trình phát triển, bạn có thể chạy lệnh sau để truy vấn trạng thái xác minh của các miền mà tổ chức của bạn sở hữu:

adb shell pm get-app-links --user cur PACKAGE_NAME

Trong kết quả mẫu sau, mặc dù ứng dụng không xác minh được ứng dụng cho miền "example.org", nhưng người dùng 0 đã phê duyệt ứng dụng theo cách thủ công trong phần cài đặt hệ thống và không có gói nào khác được xác minh cho miền đó.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

Bạn cũng có thể sử dụng các lệnh shell để mô phỏng quy trình mà người dùng chọn ứng dụng liên kết với một miền nhất định. Bạn có thể xem nội dung giải thích đầy đủ về các lệnh này trong kết quả của adb shell pm.

Cung cấp bối cảnh cho yêu cầu

Trước khi bạn đưa ra yêu cầu phê duyệt miền này, hãy cung cấp một số ngữ cảnh cho người dùng. Ví dụ: bạn có thể hiển thị cho họ màn hình chờ, hộp thoại hoặc thành phần giao diện người dùng tương tự giải thích cho người dùng lý do ứng dụng của bạn nên là trình xử lý mặc định cho một miền cụ thể.

Đưa ra yêu cầu

Sau khi người dùng hiểu ứng dụng đang yêu cầu họ làm gì, hãy đưa ra yêu cầu. Để làm vậy, hãy gọi một ý định bao gồm thao tác theo ý định ACTION_APP_OPEN_BY_DEFAULT_SETTINGS và một chuỗi dữ liệu khớp với package:com.example.pkg cho ứng dụng mục tiêu, như minh hoạ trong đoạn mã sau:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

Java

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

Khi ý định được gọi, người dùng sẽ thấy một màn hình cài đặt có tên Mở theo mặc định. Màn hình này chứa một nút chọn có tên là Open supported links (Mở các đường liên kết được hỗ trợ), như minh hoạ trong hình 1.

Khi người dùng bật tuỳ chọn Mở các đường liên kết được hỗ trợ, một nhóm hộp đánh dấu sẽ xuất hiện trong phần Đường liên kết để mở trong ứng dụng này. Tại đây, người dùng có thể chọn miền họ muốn liên kết với ứng dụng của bạn. Họ cũng có thể chọn Thêm đường liên kết để thêm miền, như minh hoạ trong hình 2. Sau này, khi người dùng chọn bất kỳ đường liên kết nào trong các miền mà họ thêm, đường liên kết đó sẽ tự động mở trong ứng dụng của bạn.

Khi nút chọn được bật, một phần ở gần dưới cùng sẽ bao gồm các hộp đánh dấu cũng như nút có tên &quot;Thêm đường liên kết&quot;
Hình 1. Màn hình cài đặt hệ thống để người dùng có thể chọn đường liên kết sẽ mở trong ứng dụng của bạn theo mặc định.
Mỗi hộp đánh dấu đại diện cho một miền mà bạn có thể thêm. Các nút của hộp thoại là &quot;Cancel&quot; và &quot;Add&quot; (Thêm).
Hình 2. Hộp thoại để người dùng có thể chọn các miền khác để liên kết với ứng dụng của bạn.

Mở các miền trong ứng dụng mà ứng dụng của bạn không thể xác minh

Chức năng chính của ứng dụng có thể là mở đường liên kết với tư cách là bên thứ ba mà không thể xác minh các miền đã xử lý. Trong trường hợp này, hãy giải thích cho người dùng rằng tại thời điểm đó, khi chọn một đường liên kết trang web, họ không thể chọn giữa ứng dụng của bên thứ nhất và ứng dụng của bạn (bên thứ ba). Người dùng cần liên kết các miền với ứng dụng bên thứ ba theo cách thủ công.

Ngoài ra, hãy cân nhắc việc giới thiệu một hộp thoại hoặc hoạt động đàn hồi cho phép người dùng mở đường liên kết trong ứng dụng bên thứ nhất nếu người dùng muốn làm như vậy, hoạt động như một proxy. Trước khi thiết lập một hộp thoại hoặc hoạt động đàn hồi như vậy, hãy thiết lập ứng dụng của bạn để ứng dụng có chế độ hiển thị gói trong các ứng dụng bên thứ nhất khớp với bộ lọc ý định trên web của ứng dụng.

Kiểm thử đường liên kết đến ứng dụng

Khi triển khai tính năng liên kết ứng dụng, bạn nên kiểm thử chức năng liên kết để đảm bảo hệ thống có thể liên kết ứng dụng với trang web của bạn và xử lý các yêu cầu URL như bạn mong muốn.

Để kiểm thử tệp câu lệnh hiện có, bạn có thể sử dụng công cụ Trình tạo danh sách câu lệnh và Trình kiểm tra.

Xác nhận danh sách máy chủ cần xác minh

Khi kiểm thử, bạn nên xác nhận danh sách máy chủ liên kết mà hệ thống cần xác minh cho ứng dụng của bạn. Hãy tạo một danh sách tất cả URL có bộ lọc ý định tương ứng bao gồm các thuộc tính và phần tử sau:

  • Thuộc tính android:scheme có giá trị http hoặc https
  • Thuộc tính android:host có mẫu URL miền
  • Phần tử hành động android.intent.action.VIEW
  • android.intent.category.BROWSABLE phần tử danh mục

Sử dụng danh sách này để kiểm tra nhằm đảm bảo tệp JSON chứa Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) được cung cấp trên từng máy chủ và miền con đã đặt tên.

Xác nhận các tệp Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số)

Đối với mỗi trang web, hãy sử dụng Digital Asset Links API (API Đường liên kết đến tài sản kỹ thuật số) để xác nhận rằng tệp JSON chứa Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) được lưu trữ và xác định đúng cách:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://domain.name:optional_port&
   relation=delegate_permission/common.handle_all_urls

Trong quá trình kiểm thử, bạn có thể kiểm tra các chế độ cài đặt hệ thống hiện tại để xem cách xử lý đường liên kết. Hãy sử dụng lệnh sau để xem danh sách các chính sách xử lý đường liên kết hiện có cho tất cả ứng dụng trên thiết bị đã kết nối của bạn:

adb shell dumpsys package domain-preferred-apps

Hoặc cách sau cũng thực hiện tương tự:

adb shell dumpsys package d

Lưu ý: Hãy nhớ đợi ít nhất 20 giây sau khi cài đặt ứng dụng để cho phép hệ thống hoàn tất quy trình xác minh.

Lệnh này sẽ trả về một danh sách từng người dùng hoặc hồ sơ được xác định trên thiết bị, đứng sau một tiêu đề ở định dạng sau:

App linkages for user 0:

Theo tiêu đề này, kết quả sẽ sử dụng định dạng sau để liệt kê các chế độ cài đặt xử lý liên kết cho người dùng đó:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

Trang thông tin này cho biết ứng dụng nào được liên kết với miền nào của người dùng đó:

  • Package – Xác định một ứng dụng theo tên gói, như được khai báo trong tệp kê khai.
  • Domains – Hiển thị danh sách đầy đủ các máy chủ có đường liên kết web mà ứng dụng này xử lý, sử dụng các khoảng trống làm dấu phân cách.
  • Status – Cho biết chế độ cài đặt xử lý đường liên kết hiện tại của ứng dụng này. Một ứng dụng đã vượt qua quy trình xác minh và có tệp kê khai chứa android:autoVerify="true" sẽ có trạng thái always. Số thập lục phân sau trạng thái này có liên quan đến bản ghi của hệ thống Android về các lựa chọn ưu tiên về liên kết ứng dụng của người dùng. Giá trị này không cho biết liệu xác minh có thành công hay không.

Lưu ý: Nếu người dùng thay đổi chế độ cài đặt đường liên kết đến ứng dụng cho một ứng dụng trước khi quá trình xác minh hoàn tất thì có thể bạn sẽ thấy trạng thái dương tính giả là xác minh thành công, mặc dù quá trình xác minh không thành công. Tuy nhiên, lỗi xác minh này sẽ không ảnh hưởng nếu người dùng cho phép ứng dụng mở các đường liên kết được hỗ trợ một cách rõ ràng mà không cần hỏi. Điều này là do lựa chọn ưu tiên của người dùng được ưu tiên hơn so với xác minh có lập trình (hoặc chưa được xác minh có lập trình). Do đó, đường liên kết sẽ chuyển thẳng đến ứng dụng của bạn mà không hiện hộp thoại, giống như khi xác minh thành công.

Ví dụ về kiểm thử

Để xác minh đường liên kết ứng dụng thành công, hệ thống phải xác minh được ứng dụng của bạn với từng trang web bạn chỉ định trong một bộ lọc ý định nhất định đáp ứng tiêu chí về đường liên kết ứng dụng. Ví dụ sau đây cho thấy cấu hình tệp kê khai có một số đường liên kết ứng dụng được xác định:

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

</application>

Danh sách máy chủ mà nền tảng sẽ cố gắng xác minh từ tệp kê khai ở trên là:

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

Danh sách các máy chủ mà nền tảng sẽ không tìm cách xác minh từ tệp kê khai ở trên là:

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

Để tìm hiểu thêm về danh sách câu lệnh, hãy xem phần Tạo danh sách câu lệnh.

Khắc phục các lỗi triển khai thường gặp

Nếu bạn không thể xác minh Đường liên kết trong ứng dụng Android, hãy kiểm tra các lỗi thường gặp sau. Phần này sử dụng example.com làm tên miền phần giữ chỗ. Khi thực hiện các bước kiểm tra này, hãy thay thế example.com bằng tên miền thực tế của máy chủ.

Thiết lập bộ lọc ý định không chính xác
Kiểm tra xem bạn có đưa một URL mà ứng dụng của bạn không sở hữu vào phần tử <intent-filter> hay không.
Cấu hình máy chủ không chính xác

Kiểm tra cấu hình JSON của máy chủ và đảm bảo giá trị SHA là chính xác.

Ngoài ra, hãy kiểm tra để đảm bảo rằng example.com. (cùng với dấu chấm) phân phát cùng một nội dung như example.com.

Chuyển hướng phía máy chủ

Hệ thống sẽ không xác minh bất kỳ Đường liên kết trong ứng dụng Android nào cho ứng dụng của bạn nếu bạn thiết lập lệnh chuyển hướng như sau:

  • http://example.com đến https://example.com
  • example.com đến www.example.com

Hành vi này giúp đảm bảo tính bảo mật cho ứng dụng.

Khả năng hoạt động của máy chủ

Kiểm tra xem máy chủ có thể kết nối với các ứng dụng khách của bạn hay không.

Đường liên kết không thể xác minh

Để thử nghiệm, bạn có thể chủ ý thêm các đường liên kết không thể xác minh. Xin lưu ý rằng trên Android 11 trở xuống, các đường liên kết này khiến hệ thống không xác minh tất cả Đường liên kết trong ứng dụng Android cho ứng dụng của bạn.

Chữ ký trong assetlinks.json không chính xác

Xác minh rằng chữ ký của bạn là chính xác và khớp với chữ ký dùng để ký ứng dụng. Các lỗi phổ biến bao gồm:

  • Ký ứng dụng bằng chứng chỉ gỡ lỗi và chỉ có chữ ký phát hành trong assetlinks.json.
  • Có chữ ký thường trong assetlinks.json. Chữ ký phải được viết hoa.
  • Nếu bạn đang sử dụng Tính năng ký ứng dụng của Play, hãy đảm bảo bạn đang dùng chữ ký mà Google dùng để ký từng bản phát hành. Bạn có thể xác minh những thông tin chi tiết này, bao gồm cả đoạn mã JSON hoàn chỉnh, bằng cách làm theo hướng dẫn về cách khai báo mối liên kết trang web.