เมื่อมี android:autoVerify="true" ในตัวกรอง Intent ของแอปอย่างน้อย 1 รายการ การติดตั้งแอปในอุปกรณ์ที่ใช้ Android 6.0 (ระดับ API 23) ขึ้นไปจะทำให้ระบบยืนยันโฮสต์ที่เชื่อมโยงกับ URL ในตัวกรอง Intent ของแอปโดยอัตโนมัติ ใน Android 12 ขึ้นไป คุณยังเรียกใช้กระบวนการยืนยันด้วยตนเองเพื่อทดสอบตรรกะการยืนยันได้ด้วย
การยืนยันอัตโนมัติ
การยืนยันอัตโนมัติของระบบเกี่ยวข้องกับสิ่งต่อไปนี้
- ระบบจะตรวจสอบตัวกรอง Intent ทั้งหมดที่มีข้อมูลต่อไปนี้
- การดำเนินการ:
android.intent.action.VIEW - หมวดหมู่:
android.intent.category.BROWSABLEและandroid.intent.category.DEFAULT - รูปแบบข้อมูล:
httpหรือhttps
- การดำเนินการ:
- สำหรับชื่อโฮสต์ที่ไม่ซ้ำกันแต่ละรายการที่พบในตัวกรอง Intent ระบบ Android จะค้นหา เว็บไซต์ที่เกี่ยวข้องสำหรับไฟล์ลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ที่ https://hostname/.well-known/assetlinks.json
หลังจากยืนยันรายชื่อเว็บไซต์ที่จะเชื่อมโยงกับแอปและยืนยันว่าไฟล์ JSON ที่โฮสต์ใช้ได้แล้ว ให้ติดตั้งแอปในอุปกรณ์ รออย่างน้อย 20 วินาทีเพื่อให้กระบวนการยืนยันแบบไม่พร้อมกันเสร็จสมบูรณ์ ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่าระบบได้ยืนยันแอปของคุณและตั้งค่านโยบายการจัดการลิงก์ที่ถูกต้องแล้วหรือไม่
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "http://domain.name:optional_port"
การยืนยันด้วยตนเอง
ตั้งแต่ Android 12 เป็นต้นไป คุณจะเรียกใช้การยืนยันโดเมนด้วยตนเองสำหรับแอปที่ติดตั้งในอุปกรณ์ได้ คุณสามารถดำเนินการตามกระบวนการนี้ได้ไม่ว่าแอปจะกำหนดเป้าหมายเป็น Android 12 หรือไม่ก็ตาม
ทำการเชื่อมต่ออินเทอร์เน็ต
หากต้องการยืนยันโดเมน อุปกรณ์ทดสอบต้องเชื่อมต่ออินเทอร์เน็ต
รองรับกระบวนการยืนยันโดเมนที่อัปเดตแล้ว
หากแอปกำหนดเป้าหมายเป็น Android 12 ขึ้นไป ระบบจะใช้กระบวนการยืนยันโดเมนที่อัปเดตแล้วโดยอัตโนมัติ
หรือคุณจะเปิดใช้กระบวนการยืนยันที่อัปเดตแล้วด้วยตนเองก็ได้ โดยให้ เรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล
adb shell am compat enable 175408749 PACKAGE_NAME
รีเซ็ตสถานะของ Android App Link ในอุปกรณ์
ก่อนที่จะเรียกใช้การยืนยันโดเมนในอุปกรณ์ด้วยตนเอง คุณต้องรีเซ็ต สถานะของ Android App Link ในอุปกรณ์ทดสอบ โดยเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล
adb shell pm set-app-links --package PACKAGE_NAME 0 all
คำสั่งนี้จะทำให้อุปกรณ์อยู่ในสถานะเดียวกับก่อนที่ผู้ใช้จะเลือกแอปเริ่มต้นสำหรับโดเมนใดก็ตาม
เรียกใช้กระบวนการยืนยันโดเมน
หลังจากรีเซ็ตสถานะของ Android App Link ในอุปกรณ์แล้ว คุณจะทำการ ยืนยันได้ โดยเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล
adb shell pm verify-app-links --re-verify PACKAGE_NAME
ตรวจสอบผลการยืนยัน
หลังจากให้เวลาตัวแทนการยืนยันดำเนินการตามคำขอเสร็จสิ้นแล้ว ให้ตรวจสอบผลการยืนยัน หากต้องการดำเนินการดังกล่าว ให้เรียกใช้คำสั่งต่อไปนี้
adb shell pm get-app-links PACKAGE_NAME
เอาต์พุตของคำสั่งนี้จะคล้ายกับตัวอย่างต่อไปนี้
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
โดเมนที่ผ่านการยืนยันสำเร็จจะมีสถานะการยืนยันโดเมน
เป็น verified สถานะอื่นๆ แสดงว่าดำเนินการยืนยันโดเมนไม่ได้
โดยเฉพาะสถานะ none หมายความว่าตัวแทนการยืนยันอาจยังไม่ได้ดำเนินการกระบวนการยืนยันให้เสร็จสมบูรณ์
รายการต่อไปนี้แสดงค่าที่ส่งคืนที่เป็นไปได้ซึ่งการยืนยันโดเมนสามารถ ส่งคืนสำหรับโดเมนที่ระบุ
none- ไม่มีการบันทึกข้อมูลสำหรับโดเมนนี้ รออีกสัก 2-3 นาทีเพื่อให้ ตัวแทนการยืนยันดำเนินการตามคำขอที่เกี่ยวข้องกับการยืนยันโดเมนให้เสร็จสมบูรณ์ จากนั้นเรียกใช้กระบวนการยืนยันโดเมนอีกครั้ง
verified- โดเมนได้รับการยืนยันสําหรับแอปที่ประกาศเรียบร้อยแล้ว
approved- โดเมนได้รับการอนุมัติโดยบังคับ ซึ่งมักจะเกิดจากการเรียกใช้คำสั่งเชลล์
denied- โดเมนถูกปฏิเสธโดยบังคับ ซึ่งมักเกิดจากการเรียกใช้คำสั่งเชลล์
migrated- ระบบได้เก็บผลลัพธ์ของกระบวนการก่อนหน้านี้ที่ใช้การยืนยันโดเมนเดิมไว้
restored- โดเมนได้รับการอนุมัติหลังจากที่ผู้ใช้กู้คืนข้อมูล ระบบจะถือว่าโดเมนได้รับการยืนยันแล้วก่อนหน้านี้
legacy_failure- ผู้ตรวจสอบรุ่นเดิมปฏิเสธโดเมน ไม่ทราบสาเหตุที่เฉพาะเจาะจงของความล้มเหลว
system_configured- โดเมนได้รับการอนุมัติโดยอัตโนมัติจากการกำหนดค่าอุปกรณ์
- รหัสข้อผิดพลาด
1024ขึ้นไป รหัสข้อผิดพลาดที่กำหนดเองซึ่งเฉพาะเจาะจงสำหรับเครื่องมือยืนยันของอุปกรณ์
โปรดตรวจสอบอีกครั้งว่าคุณได้สร้างการเชื่อมต่อเครือข่าย แล้ว และเรียกใช้กระบวนการ ยืนยันโดเมนอีกครั้ง
ขอให้ผู้ใช้เชื่อมโยงแอปของคุณกับโดเมน
อีกวิธีหนึ่งที่แอปจะได้รับการอนุมัติสำหรับโดเมนคือการขอให้ผู้ใช้เชื่อมโยงแอปของคุณกับโดเมนนั้น
ตรวจสอบว่าแอปของคุณได้รับอนุมัติสำหรับโดเมนแล้วหรือไม่
ก่อนที่จะแจ้งให้ผู้ใช้ดำเนินการ ให้ตรวจสอบว่าแอปของคุณเป็นตัวแฮนเดิลเริ่มต้นสำหรับ
โดเมนที่คุณกำหนดในองค์ประกอบ <intent-filter> หรือไม่ คุณสามารถค้นหาสถานะการอนุมัติได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
DomainVerificationManagerAPI (ที่รันไทม์)- โปรแกรมบรรทัดคำสั่ง (ระหว่างการทดสอบ)
DomainVerificationManager
ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้ DomainVerificationManager API
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);
}
}
โปรแกรมบรรทัดคำสั่ง
เมื่อทดสอบแอปในระหว่างการพัฒนา คุณสามารถเรียกใช้คำสั่งต่อไปนี้เพื่อ ค้นหาสถานะการยืนยันของโดเมนที่องค์กรของคุณเป็นเจ้าของ
adb shell pm get-app-links --user cur PACKAGE_NAME
ในเอาต์พุตตัวอย่างต่อไปนี้ แม้ว่าแอปจะไม่ผ่านการยืนยันสำหรับโดเมน "example.org" แต่ผู้ใช้ 0 ได้อนุมัติแอปด้วยตนเองในการตั้งค่าระบบ และไม่มีแพ็กเกจอื่นที่ได้รับการยืนยันสำหรับโดเมนนั้น
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
นอกจากนี้ คุณยังใช้คำสั่งเชลล์เพื่อจำลองกระบวนการที่ผู้ใช้เลือกแอปที่เชื่อมโยงกับโดเมนที่กำหนดได้ด้วย ดูคำอธิบายแบบเต็มของคำสั่งเหล่านี้ได้จากเอาต์พุตของ adb shell pm
ระบุบริบทของคำขอ
ก่อนที่จะส่งคำขออนุมัติโดเมนนี้ โปรดระบุบริบทบางอย่างสำหรับผู้ใช้ เช่น คุณอาจแสดงหน้าจอเริ่มต้น กล่องโต้ตอบ หรือองค์ประกอบ UI ที่คล้ายกัน ซึ่งอธิบายให้ผู้ใช้ทราบว่าเหตุใดแอปของคุณจึงควรเป็นตัวแฮนเดิลเริ่มต้น สำหรับโดเมนหนึ่งๆ
ส่งคำขอ
หลังจากที่ผู้ใช้เข้าใจสิ่งที่แอปขอให้ทำแล้ว ให้ส่งคำขอ
โดยเรียกใช้ Intent ที่มี
ACTION_APP_OPEN_BY_DEFAULT_SETTINGS
การดำเนินการผ่าน Intent และสตริงข้อมูลที่ตรงกับ
package:com.example.pkg สำหรับแอปเป้าหมาย ดังที่แสดงใน
ข้อมูลโค้ดต่อไปนี้
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);
เมื่อเรียกใช้ Intent ผู้ใช้จะเห็นหน้าจอการตั้งค่าที่ชื่อเปิดโดย ค่าเริ่มต้น หน้าจอนี้มีปุ่มตัวเลือกชื่อเปิดลิงก์ที่รองรับ ดังที่แสดงในรูปที่ 1
เมื่อผู้ใช้เปิดเปิดลิงก์ที่รองรับ ช่องทำเครื่องหมายชุดหนึ่งจะปรากฏขึ้น ในส่วนที่ชื่อลิงก์ที่จะเปิดในแอปนี้ จากนั้นผู้ใช้จะ เลือกโดเมนที่ต้องการเชื่อมโยงกับแอปของคุณได้ นอกจากนี้ ผู้ใช้ยัง เลือกเพิ่มลิงก์เพื่อเพิ่มโดเมนได้ด้วย ดังที่แสดงในรูปที่ 2 เมื่อผู้ใช้เลือก ลิงก์ใดก็ตามภายในโดเมนที่เพิ่มในภายหลัง ลิงก์จะเปิดในแอปของคุณ โดยอัตโนมัติ
เปิดโดเมนในแอปที่แอปยืนยันไม่ได้
ฟังก์ชันหลักของแอปอาจเป็นการเปิดลิงก์ในฐานะบุคคลที่สามโดยไม่มีความสามารถในการยืนยันโดเมนที่จัดการ ในกรณีนี้ ให้แจ้งผู้ใช้ว่า เมื่อเลือกเว็บลิงก์ในขณะนั้น ผู้ใช้จะเลือกไม่ได้ระหว่าง แอปของบุคคลที่หนึ่งกับแอปของคุณ (ของบุคคลที่สาม) ผู้ใช้ต้องเชื่อมโยงโดเมนกับแอปของบุคคลที่สามด้วยตนเอง
นอกจากนี้ ให้พิจารณาแสดงกล่องโต้ตอบหรือกิจกรรมแทรมโพลีนที่อนุญาตให้ผู้ใช้เปิดลิงก์ในแอปของบุคคลที่หนึ่งหากผู้ใช้ต้องการทำเช่นนั้น โดยทำหน้าที่เป็นพร็อกซี ก่อนที่จะตั้งค่ากล่องโต้ตอบหรือกิจกรรม Trampoline ดังกล่าว ให้ตั้งค่าแอปเพื่อให้มีระดับการมองเห็นแพ็กเกจ ในแอปของบุคคลที่หนึ่งที่ตรงกับตัวกรอง Intent บนเว็บของแอป
เวลาในการตอบสนองของการอัปเดตลิงก์เนื้อหาดิจิทัล
เมื่อคุณอัปเดตไฟล์ assetlinks.json ในเว็บเซิร์ฟเวอร์ เวลาที่ใช้เพื่อให้การเปลี่ยนแปลงเหล่านี้แสดงในอุปกรณ์ของผู้ใช้ปลายทางจะขึ้นอยู่กับเวอร์ชันของระบบปฏิบัติการ ดังนี้
- Android 15 (ระดับ API 35) ขึ้นไป: ระบบจะยืนยันโดเมนอีกครั้งเป็นระยะๆ ในเบื้องหลัง การเปลี่ยนแปลงอาจใช้เวลาถึง 7 วันจึงจะมีผลกับอุปกรณ์ของผู้ใช้ปลายทางทั้งหมดเนื่องจากการแคชของระบบและการ ยืนยันซ้ำที่กำหนดเวลาไว้
- Android 14 (ระดับ API 34) และต่ำกว่า: ระบบจะไม่ทำการตรวจสอบซ้ำในเบื้องหลังเป็นระยะๆ โดยปกติแล้ว ระบบจะ เลือกการอัปเดตไฟล์เฉพาะเมื่อมีการติดตั้งหรืออัปเดตแอป
ข้อมูลอัปเดตเกี่ยวกับการทดสอบ
หากต้องการบังคับให้ยืนยันอีกครั้งในอุปกรณ์ที่เฉพาะเจาะจงระหว่างการทดสอบ คุณสามารถ
ถอนการติดตั้งและติดตั้งแอปอีกครั้งได้ อย่างไรก็ตาม โปรดทราบว่าแคชฝั่งเซิร์ฟเวอร์อาจ
ยังคงทำให้การนำส่งไฟล์ assetlinks.json ที่อัปเดตไปยังอุปกรณ์ล่าช้า
แม้หลังจากติดตั้งอีกครั้งแล้วก็ตาม เนื่องจากแคชอิงตามเวลา ความล่าช้าจึงมักจะ
แก้ไขได้โดยอัตโนมัติหากคุณลองอีกครั้งหลังจากผ่านไป 2-3 ชั่วโมง