Đườ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 các 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 để thiết lập mức độ tin cậy rằng ứng dụng của bạn đã được trang web phê duyệt để tự động mở các đường liên kết cho miền đó. Nếu hệ thống xác minh thành công rằng bạn sở hữu các URL đó, thì hệ thống sẽ tự động định tuyế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 trang web, hãy hoàn tất các bước sau:
Thêm bộ lọc ý định có chứa thuộc tính
autoVerify
. Thuộc tính này báo hiệu cho hệ thống rằng hệ thống nên xác minh xem ứng dụng của bạn có thuộc về các miền URL được dùng trong bộ lọc ý định hay không.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 Đườ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 đến ứng dụng
Để bật quy trình xác minh việc 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". -->
<!-- Do not include other schemes. -->
<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 khai báo <intent-filter>
cho mỗi máy chủ lưu trữ, ngay cả khi máy chủ lưu trữ đó được dùng trong các 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 được 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 phải có kết nối Internet và có thể mất 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 này, hệ thống chỉ xác minh một miền cho ứng dụng nhắm đến Android 12 trở lên nếu miền đó nằm trong một phần tử <intent-filter>
có chứa định dạng chính xác được chỉ định trong đoạn mã trước.
Ví dụ: các lược đồ khác với "http" và "https", chẳng hạn như <data android:scheme="custom" />
, sẽ ngăn <intent-filter>
kích hoạt quy trình xác minh miền.
Hỗ trợ liên kết ứng dụng cho nhiều máy chủ lưu trữ
Hệ thống phải có khả năng xác minh máy chủ lưu trữ được chỉ định trong các 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 quy trình xác minh không thành công, hệ thống sẽ chuyển về hành vi tiêu 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, ứng dụng vẫn có thể được xác minh là trình xử lý mặc định cho bất kỳ mẫu URL nào đượ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 hệ thống tìm thấy một tệp Digital Asset Links phù hợp cho tất cả các máy chủ 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ìm thấy tệp assetlinks.json
tại https://www.example.com/.well-known/assetlinks.json
nhưng không tìm thấy 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ả phần tử <data>
trong cùng một bộ lọc ý định sẽ được hợp nhất với nhau để tính đến tất cả các biến thể của các thuộc tính kết hợp. Ví dụ: bộ lọc ý định đầu tiên ở trên có một phần tử <data>
chỉ khai báo lược đồ HTTPS. Nhưng nó được kết hợp với phần tử <data>
khác để bộ lọc ý định hỗ trợ cả http://www.example.com
và https://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 lược đồ URI và miền.
Hỗ trợ liên kết ứng dụng cho nhiều miền con
Giao thức Digital Asset Links coi các miền con trong bộ lọc ý định của bạn là các máy chủ riêng biệt và duy nhất. Vì vậy, nếu bộ lọc ý định của bạn liệt kê nhiều máy chủ có các miền con khác nhau, thì bạn phải xuất bản 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.com
và mobile.example.com
làm máy chủ URL ý định được chấp nhận. Vì vậy, bạn phải xuất bản assetlinks.json
hợp lệ tại cả 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="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 ký tự đại diện (chẳng hạn như *.example.com
), bạn phải xuất bản tệp assetlinks.json
tại tên máy chủ gốc (example.com
). Ví dụ: một ứ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 xem có nhiều ứng dụng được liên kết với cùng một miền hay không
Nếu bạn xuất bản nhiều ứng dụng, mỗi ứng dụng được liên kết với cùng một miền, thì mỗi ứng dụng đều 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 chính xác cùng một đường dẫn và máy chủ lưu trữ miền, chẳng hạn như trong trường hợp ứng dụng có phiên bản rút gọn và phiên bản đầy đủ, thì chỉ ứng dụng được cài đặt gần đây nhất mới có thể phân giải ý định trên web cho miền đó.
Trong trường hợp như thế này, hãy kiểm tra xem có ứng dụng nào xung đột trên thiết bị của người dùng hay không, miễn là bạn có khả năng hiển thị gói cần thiết. Sau đó, trong ứng dụng của bạn, hãy hiện một hộp thoại trình chọn tuỳ chỉnh chứa kết quả từ lệnh gọi queryIntentActivities()
.
Người dùng có thể chọn ứng dụng mà 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 một tệp JSON chứa Đườ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 những ứ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 các ứng dụng được liên kết:
package_name
: Mã ứng dụng được khai báo trong tệpbuild.gradle
của ứng dụng.sha256_cert_fingerprints
: Vân tay số SHA256 của chứng chỉ ký của ứng dụng. Bạn có thể dùng lệnh sau để tạo vân tay thông qua keytool Java: Trường này hỗ trợ nhiều dấu vân tay. Bạn có thể dùng dấu vân tay để hỗ trợ các phiên bản khác nhau của ứng dụng, chẳng hạn như bản gỡ lỗi và bản phát hành công khai.keytool -list -v -keystore my-release-key.keystore
Nếu bạn đang sử dụng Tính năng ký ứng dụng của Play cho ứng dụng, thì dấu vân tay chứng chỉ được tạo ra khi chạy
keytool
cục bộ thường sẽ không khớp với dấu vân tay trên thiết bị của người dùng. Bạn có thể xác minh xem mình có đang dùng tính năng Ký ứng dụng Play cho ứng dụng trong tài khoản nhà phát triển trên Play Console ở phầnRelease > Setup > App signing
hay không. Nếu có, thì 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
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 mối liên kết với nhiều ứng dụng trong cùng một tệp assetlinks.json
. Danh sách tệp sau đây cho thấy ví dụ về một tệp kê khai khai báo mối liên kết với 2 ứng dụng 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ý các đường liên kết cho các 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 một bộ lọc ý định cho https://example.com/articles
và app2 có thể khai báo một bộ lọc ý định cho https://example.com/videos
.
Lưu ý: Nhiều ứng dụng được liên kết với một miền có thể được ký bằng cùng một hoặc nhiều chứng chỉ khác nhau.
Liên kết nhiều trang web với một ứng dụng
Nhiều trang web có thể khai báo 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. Danh sách tệp sau đây cho thấy một ví dụ về cách khai báo mối liên kết của example.com và example.net với app1. Mục đầu tiên cho thấy mối liên kết củ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"] } }]
Danh sách tiếp theo cho thấy mối liên kết của example.net với app1. Chỉ khác nhau về vị trí lưu trữ các tệp này (.com
và .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"] } }]
Xuất bản tệp xác minh JSON
Bạn phải xuất bản tệp xác minh JSON tại vị trí sau:
https://domain.name/.well-known/assetlinks.json
Hãy đảm bảo những điều sau:
- Tệp
assetlinks.json
được phân phát bằng content-typeapplication/json
. - Bạn phải truy cập được vào tệp
assetlinks.json
qua kết nối HTTPS, bất kể bộ lọc ý định của ứng dụng có khai báo HTTPS dưới dạng lược đồ dữ liệu hay không. - Bạn phải truy cập được tệp
assetlinks.json
mà không cần chuyển hướng (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 xuất bản tệp
assetlinks.json
trên từng miền. Xem phần Hỗ trợ liên kết ứng dụng cho nhiều máy chủ lưu trữ. - Không xuất bản ứng dụng có URL dành cho quá trình phát triển/kiểm thử trong tệp kê khai mà công chúng có thể không truy cập được (chẳng hạn như mọi URL 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 dành cho nhà phát triển.
Xác minh Đường liên kết trong ứng dụng Android
Khi android:autoVerify="true"
xuất hiện trong ít nhất một bộ lọc ý định của ứng dụng, việc cài đặt ứng dụng trên 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 các máy chủ lưu trữ được liên kết với 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 bước sau:
- Hệ thống sẽ kiểm tra tất cả các 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.BROWSABLE
vàandroid.intent.category.DEFAULT
- Lược đồ dữ liệu:
http
hoặchttps
- Hành động:
- Đối với mỗi tên máy chủ lưu trữ duy nhất được tìm thấy trong các bộ lọc ý định ở trên, Android sẽ truy vấn các trang web tương ứng để tìm tệp Digital Asset Links tại
https://hostname/.well-known/assetlinks.json
.
Sau khi bạn xác nhận danh sách các trang web cần liên kết với ứng dụng 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. Đợi ít nhất 20 giây để quy trình xác minh không đồng bộ hoàn tất. Sử dụng lệnh sau để kiểm tra xem hệ thống có xác minh ứng dụng của bạn và đặt chính sách xử lý đường liên kết chính xác hay không:
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 quy 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 mới
Nếu ứng dụng của bạn nhắm đến Android 12 trở lên, hệ thống sẽ tự động sử dụng quy trình xác minh miền mới.
Nếu không, bạn có thể bật quy trình xác minh mới 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 đến ứ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 một thiết bị, bạn phải đặt lại trạng thái của Đường liên kết đến ứng dụng Android trên thiết bị kiểm thử. Để 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 set-app-links --package PACKAGE_NAME 0 all
Lệnh này đặt thiết bị ở trạng thái giống như trước khi người dùng chọn ứng dụng mặc định cho bất kỳ miền nào.
Triệu hồi quy trình xác minh miền
Sau khi đặt lại trạng thái của Đường liên kết đến ứng dụng Android trên một thiết bị, bạn có thể tự thực hiện quy trình 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 phép tác nhân xác minh hoàn tất các yêu cầu, hãy xem xét kết quả xác minh. Để thực hiện việc nà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
Những miền xác minh thành công sẽ có trạng thái xác minh miền là verified
. Mọi trạng thái khác đều cho biết rằng 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 rằng 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 biết các giá trị trả về có thể có mà quy trình xác minh miền có thể trả về cho một miền nhất định:
none
- Chưa ghi lại phản hồi nào cho miền này. Đợi 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 này được phê duyệt bắt buộc, thường là bằng cách thực thi một lệnh shell.
denied
- Miền bị từ chối bắt buộc, thường là do thực thi một lệnh shell.
migrated
- Hệ thống đã giữ lại kết quả của một quy trình trước đó sử dụng phương thức xác minh miền cũ.
restored
- Miền được phê duyệt sau khi người dùng thực hiện thao tác khôi phục dữ liệu. Giả sử miền này đã được xác minh trước đó.
legacy_failure
- Miền đã bị trình xác minh cũ từ chối. Chưa xác định được lý do cụ thể gây ra lỗi.
system_configured
- Cấu hình thiết bị đã tự động phê duyệt miền này.
- Mã lỗi từ
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 bạn đã thiết lập kết nối mạng và gọ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 một miền
Một cách khác để ứng dụng của bạn được phê duyệt cho một miền là yêu cầu người dùng liên kết ứng dụng của bạn với miền đó.
Kiểm tra xem ứng dụng của bạn đã được phê duyệt cho miền này 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 các 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:
- API
DomainVerificationManager
(trong thời gian chạy). - Một chương trình dòng lệnh (trong quá trình kiểm thử).
DomainVerificationManager
Đ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 ví dụ về đầu ra sau đây, mặc dù ứng dụng không xác minh được 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ể dùng các lệnh shell để mô phỏng quy trình người dùng chọn ứng dụng được liên kết với một miền nhất định. Bạn có thể xem phần giải thích đầy đủ về các lệnh này trong đầu ra 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ố thông tin cho người dùng. Ví dụ: bạn có thể cho họ thấy một màn hình khởi động, hộp thoại hoặc một phần tử tương tự trên giao diện người dùng để 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 được những gì ứng dụng yêu cầu họ làm, 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 đích, 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 là Mở theo mặc định. Màn hình này có một nút chọn có tên là 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 chế độ Mở đườ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 những miền mà 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 đó, 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.
Các miền mở 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ở các đường liên kết dưới dạng bên thứ ba mà không có khả năng xác minh các miền được xử lý. Nếu đúng như vậ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 trên 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 miền với ứng dụng bên thứ ba của bạn 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 của bên thứ nhất nếu người dùng muốn làm như vậy, đóng vai trò là một proxy. Trước khi thiết lập một hộp thoại hoặc hoạt động trung gian như vậy, hãy thiết lập ứng dụng của bạn để ứng dụng có khả năng hiển thị gói đối với 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 của bạn với các trang web của bạn và xử lý các yêu cầu URL như bạn mong đợi.
Để kiểm thử một tệp khai báo hiện có, bạn có thể sử dụng công cụ Statement List Generator and Tester (Trình tạo và kiểm thử danh sách khai báo).
Xác nhận danh sách máy chủ lưu trữ cần xác minh
Khi kiểm thử, bạn nên xác nhận danh sách các máy chủ lưu trữ được liên kết mà hệ thống cần xác minh cho ứng dụng của bạn. Lập danh sách tất cả cá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ị làhttp
hoặchttps
- Thuộc tính
android:host
có mẫu URL miền - Phần tử thao tác
android.intent.action.VIEW
- Phần tử danh mục
android.intent.category.BROWSABLE
Sử dụng danh sách này để kiểm tra xem tệp JSON chứa Digital Asset Links (Đường liên kết đến tài sản kỹ thuật số) có được cung cấp trên mỗi máy chủ lưu trữ và miền phụ được đặt tên hay không.
Xác nhận tệp Digital Asset Links
Đối với mỗi trang web, hãy sử dụng Digital Asset Links API để xác nhận rằng tệp JSON chứa Đườ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
Kiểm tra chính sách liên kết
Trong quá trình kiểm thử, bạn có thể kiểm tra chế độ cài đặt hệ thống hiện tại để xử lý đường liên kết. Sử dụng lệnh sau để xem danh sách các chính sách hiện có về việc xử lý đường liên kết cho tất cả ứng dụng trên thiết bị được kết nối:
adb shell dumpsys package domain-preferred-apps
Hoặc đoạn mã sau đây cũng làm được điều tương tự:
adb shell dumpsys package d
Lưu ý: Đảm bảo bạn đợi ít nhất 20 giây sau khi cài đặt ứng dụng để hệ thống hoàn tất quy trình xác minh.
Lệnh này trả về danh sách từng người dùng hoặc hồ sơ được xác định trên thiết bị, trước đó là tiêu đề theo định dạng sau:
App linkages for user 0:
Sau tiêu đề này, đầu ra sẽ sử dụng định dạng sau để liệt kê các chế độ cài đặt xử lý đường liên kết cho người dùng đó:
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 miền nào đối với 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 của ứng dụng.Domains
– Hiện danh sách đầy đủ các máy chủ mà ứng dụng này xử lý đường liên kết trên web, sử dụng khoảng trắng làm dấu phân cách.Status
– Cho biết chế độ xử lý đường liên kết hiện tại của ứng dụng này. Ứng dụng đã vượt qua quy trình xác minh và có tệp kê khai chứaandroid:autoVerify="true"
sẽ có trạng tháialways
. 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 liên kết ứng dụng của người dùng. Giá trị này không cho biết liệu quá trình 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, bạn có thể thấy kết quả dương tính giả cho một lượt xác minh thành công, mặc dù quá trình xác minh đã thất bại. Tuy nhiên, lỗi xác minh này không quan trọng nếu người dùng đã bật rõ ràng cho phép ứng dụng mở các đường liên kết được hỗ trợ 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 quy trình xác minh theo chương trình (hoặc việc thiếu quy trình này). 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 quá trình xác minh thành công.
Ví dụ về kiểm thử
Để xác minh đường liên kết đến ứng dụng thành công, hệ thống phải có thể xác minh ứng dụng của bạn với từng trang web mà bạn chỉ định trong một bộ lọc ý định nhất định đáp ứng các tiêu chí cho đường liên kết đến ứng dụng. Ví dụ sau đây cho thấy một cấu hình tệp kê khai có một số đường liên kết đến ứ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 các 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
Sau đây là danh sách các máy chủ mà nền tảng sẽ không cố gắng xác minh từ tệp kê khai ở trên:
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 thường gặp khi triển khai
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 đây. Phần này sử dụng example.com
làm tên miề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 chính xác.
Ngoài ra, hãy kiểm tra để đảm bảo rằng
example.com.
(có dấu chấm ở cuối) phân phát cùng nội dung vớiexample.com
.- Lệnh 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 một lệnh chuyển hướng như sau:
http://example.com
đếnhttps://example.com
example.com
đếnwww.example.com
Hành vi này giúp bảo vệ tính bảo mật của ứng dụng.
- Độ ổn định của máy chủ
Kiểm tra xem máy chủ của bạn có thể kết nối với các ứng dụng khách hay không.
- Đường liên kết không xác minh được
Để thử nghiệm, bạn có thể cố ý thêm các đường liên kết không xác minh được. Xin lưu ý rằng trên Android 11 trở xuống, những đườ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 đến ứng dụng Android cho ứng dụng của bạn.
- Chữ ký không chính xác trong assetlinks.json
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. Một số lỗi thường gặp:
- 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ý viết thường trong
assetlinks.json
. Chữ ký phải 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 rằng bạn đang sử dụng chữ ký mà Google dùng để ký từng bản phát hành của bạn. Bạn có thể xác minh những thông tin chi tiết này, bao gồm cả một đoạn mã JSON hoàn chỉnh, bằng cách làm theo hướng dẫn về khai báo mối liên kết với trang web.
- Ký ứng dụng bằng chứng chỉ gỡ lỗi và chỉ có chữ ký phát hành trong