Android App Link เป็น Deep Link ประเภทพิเศษที่ช่วยให้ URL ของเว็บไซต์ เพื่อเปิดเนื้อหาที่เกี่ยวข้องในแอป Android ทันที การกำหนดให้ผู้ใช้เลือกแอป Android App Link ใช้เนื้อหาดิจิทัล API ลิงก์ เพื่อสร้างความน่าเชื่อถือ ที่แอปได้รับอนุมัติจากเว็บไซต์ให้เปิดลิงก์โดยอัตโนมัติให้ โดเมนนั้น หากระบบยืนยันว่าคุณเป็นเจ้าของ URL สำเร็จแล้ว ระบบจะดำเนินการ ระบบจะกำหนดเส้นทาง Intent URL เหล่านั้นไปยังแอปของคุณโดยอัตโนมัติ
หากต้องการยืนยันว่าคุณเป็นเจ้าของ URL ของทั้งแอปและเว็บไซต์ ให้กรอกลิงก์ ขั้นตอนต่อไปนี้
เพิ่มตัวกรอง Intent ที่มีแอตทริบิวต์
autoVerify
แอตทริบิวต์นี้ส่งสัญญาณไปยังระบบว่าควรตรวจสอบว่า แอปของคุณอยู่ในโดเมน URL ที่ใช้ในตัวกรอง Intentประกาศการเชื่อมโยงระหว่างเว็บไซต์กับความตั้งใจของคุณ กรองได้โดยโฮสต์ไฟล์ JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ที่ตำแหน่งต่อไปนี้
https://domain.name/.well-known/assetlinks.json
ดูข้อมูลที่เกี่ยวข้องได้ในแหล่งข้อมูลต่อไปนี้
เพิ่มตัวกรอง Intent สำหรับการยืนยัน App Link
หากต้องการเปิดใช้การยืนยันการจัดการลิงก์สําหรับแอป ให้เพิ่มตัวกรอง Intent ที่ตรงกัน โดยใช้รูปแบบต่อไปนี้
<!-- 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>
แม้ว่าการใส่ autoVerify
ไว้ใน <intent-filter>
รายการเดียวก็เพียงพอแล้ว
สำหรับแต่ละโฮสต์ แม้ว่าโฮสต์นั้นจะมีการใช้กับโฮสต์อื่นที่ไม่ได้ทำเครื่องหมาย
เราขอแนะนำให้เพิ่ม autoVerify
ลงใน
องค์ประกอบ <intent-filter>
เพื่อความสอดคล้อง นอกจากนี้ วิธีนี้ยังช่วยให้มั่นใจได้ว่า
นำองค์ประกอบในไฟล์ Manifest ออกหรือเปลี่ยนโครงสร้างภายในโค้ด แอปของคุณจะยังเชื่อมโยงอยู่
กับโดเมนทั้งหมดที่คุณเคยกำหนดไว้
กระบวนการยืนยันโดเมนต้องใช้การเชื่อมต่ออินเทอร์เน็ต และอาจใช้เวลา
เวลาในการทำให้เสร็จ เพื่อช่วยปรับปรุงประสิทธิภาพของกระบวนการ ระบบ
ยืนยันโดเมนสำหรับแอปที่กำหนดเป้าหมายเป็น Android 12 ขึ้นไป
เฉพาะเมื่อโดเมนนั้นอยู่ในเอลิเมนต์ <intent-filter>
ที่มีส่วน
รูปแบบที่ตรงกันทั้งหมดที่ระบุในข้อมูลโค้ดก่อนหน้า
การรองรับการลิงก์แอปสำหรับหลายโฮสต์
ระบบต้องยืนยันโฮสต์ที่ระบุไว้ในองค์ประกอบข้อมูลของตัวกรอง Intent ของ URL ของแอปกับไฟล์ Digital Asset Links ที่โฮสต์ในโดเมนเว็บที่เกี่ยวข้องในตัวกรอง Intent นั้น หากการยืนยันไม่สำเร็จ ระบบจะยึดตามลักษณะการทำงานมาตรฐาน เพื่อแก้ไขเจตนา ตามที่อธิบายไว้ใน สร้าง Deep Link ไปยังเนื้อหาแอป แต่จะยังคงยืนยันว่าแอปเป็นเครื่องจัดการเริ่มต้นได้ สำหรับรูปแบบ URL ที่กำหนดไว้ในตัวกรอง Intent อื่นๆ ของแอป
หมายเหตุ: ใน Android 11 (API ระดับ 30) และต่ำกว่า ระบบ ไม่ได้ยืนยันว่าแอปของคุณเป็นตัวแฮนเดิลเริ่มต้น เว้นแต่จะพบตัวแฮนเดิลเริ่มต้น ไฟล์ลิงก์เนื้อหาดิจิทัล (Digital Asset Links) สำหรับโฮสต์ทั้งหมดที่คุณระบุใน ไฟล์ Manifest
ตัวอย่างเช่น แอปที่มีตัวกรอง Intent ต่อไปนี้จะผ่านการยืนยันสำหรับ https://www.example.com
เท่านั้น หากพบไฟล์ assetlinks.json
ที่ https://www.example.com/.well-known/assetlinks.json
แต่ไม่เห็นที่ 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>
หมายเหตุ: องค์ประกอบ <data>
ทั้งหมดในตัวกรอง Intent เดียวกัน
จะนำมารวมเข้าด้วยกันเพื่อรองรับรูปแบบทั้งหมดของแอตทริบิวต์ที่รวมกัน ตัวอย่างเช่น พารามิเตอร์
ตัวกรอง Intent แรกด้านบนจะมีเอลิเมนต์ <data>
ที่ประกาศเฉพาะ
รูปแบบ HTTPS แต่จะรวมกับองค์ประกอบ <data>
อื่นๆ เพื่อให้ Intent
ตัวกรองรองรับทั้ง http://www.example.com
และ https://www.example.com
ด้วยเหตุนี้ คุณจึงต้องสร้างตัวกรอง Intent แยกกันเมื่อต้องการกำหนดชุดค่าผสมที่เฉพาะเจาะจง
รูปแบบ URI และโดเมน
การรองรับการลิงก์แอปสำหรับโดเมนย่อยหลายโดเมน
โปรโตคอลลิงก์เนื้อหาดิจิทัล (Digital Asset Links) จะถือว่าโดเมนย่อยในตัวกรอง Intent ไม่ซ้ำกัน
แยกโฮสต์ ดังนั้นถ้าตั้งใจ
แสดงโฮสต์หลายรายการที่มีโดเมนย่อยที่แตกต่างกัน คุณต้องเผยแพร่
assetlinks.json
ในแต่ละโดเมน ตัวอย่างเช่น ตัวกรอง Intent ต่อไปนี้มี www.example.com
และ mobile.example.com
เป็นเจ้าภาพ URL ของ Intent ที่ยอมรับ ดังนั้น
assetlinks.json
ต้องเผยแพร่ที่
https://www.example.com/.well-known/assetlinks.json
และ
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>
หรือถ้าคุณประกาศชื่อโฮสต์ที่มีไวลด์การ์ด (เช่น *.example.com
)
คุณต้องเผยแพร่ไฟล์ assetlinks.json
ที่ชื่อโฮสต์ระดับรูท
(example.com
). ตัวอย่างเช่น แอปที่มีตัวกรอง Intent ต่อไปนี้จะส่ง
การยืนยันสำหรับโดเมนย่อยใดๆ ของ example.com
(เช่น foo.example.com
) เป็น
ตราบใดที่มีการเผยแพร่ไฟล์ assetlinks.json
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>
ตรวจสอบแอปหลายรายการที่เชื่อมโยงกับโดเมนเดียวกัน
หากคุณเผยแพร่แอปหลายแอปโดยที่แต่ละแอปเชื่อมโยงกับโดเมนเดียวกัน แต่ละลิงก์จะได้รับการยืนยัน อย่างไรก็ตาม หากแอปสามารถจับคู่ข้อมูล โฮสต์ของโดเมนและเส้นทางเดียวกัน เช่น กรณีที่มี Lite และเวอร์ชันเต็ม แอป เฉพาะแอปที่ติดตั้งล่าสุดเท่านั้นที่จะแก้ไข Intent ของเว็บได้ สำหรับโดเมนนั้น
ในกรณีนี้ ให้ตรวจสอบแอปที่อาจขัดแย้งกันในอุปกรณ์ของผู้ใช้
ในกรณีที่คุณมีพัสดุที่จำเป็น
ระดับการเข้าถึง จากนั้นแสดงพารามิเตอร์ที่กำหนดเอง
กล่องโต้ตอบตัวเลือกที่มีผลลัพธ์จากการเรียก
queryIntentActivities()
ผู้ใช้สามารถเลือกแอปที่ต้องการจากรายการแอปที่ตรงกันซึ่งปรากฏในกล่องโต้ตอบ
ประกาศการเชื่อมโยงเว็บไซต์
เนื้อหาดิจิทัล ลิงก์ คุณต้องเผยแพร่ไฟล์ JSON ในเว็บไซต์เพื่อระบุแอป Android ที่เชื่อมโยงกับเว็บไซต์และยืนยัน Intent ของ URL ของแอป ไฟล์ JSON ใช้ฟิลด์ต่อไปนี้เพื่อระบุแอปที่เกี่ยวข้อง
package_name
: รหัสแอปพลิเคชัน ที่ประกาศในไฟล์build.gradle
ของแอปsha256_cert_fingerprints
: ลายนิ้วมือ SHA256 ของใบรับรองการรับรองของแอป คุณสามารถใช้คําสั่งต่อไปนี้เพื่อสร้างลายนิ้วมือผ่านเครื่องมือจัดการคีย์ของ Java ช่องนี้รองรับลายนิ้วมือหลายรายการ ซึ่งสามารถใช้เพื่อสนับสนุน เวอร์ชันต่างๆ ของแอป เช่น บิลด์การแก้ไขข้อบกพร่องและเวอร์ชันที่ใช้งานจริงkeytool -list -v -keystore my-release-key.keystore
หากคุณใช้ Play App Signing สำหรับแอปของคุณ ใบรับรอง ลายนิ้วมือที่เกิดจากการเรียกใช้
keytool
ในเครื่อง ไม่ตรงกับรายการของผู้ใช้ อุปกรณ์ คุณสามารถตรวจสอบว่าคุณใช้ Play App Signing สำหรับแอปของคุณในบัญชีนักพัฒนาแอป Play Console ภายใต้Release > Setup > App signing
; ถ้าใช่ คุณก็จะ ค้นหาข้อมูลโค้ด JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ที่ถูกต้องสำหรับแอปของคุณในหน้าเดียวกัน
ตัวอย่างต่อไปนี้ assetlinks.json
จะให้สิทธิ์การเปิดลิงก์แก่
com.example
แอป Android:
[{ "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"] } }]
การเชื่อมโยงเว็บไซต์ที่มีหลายแอป
เว็บไซต์สามารถประกาศการเชื่อมโยงกับแอปหลายรายการภายใน assetlinks.json
เดียวกันได้
รายการไฟล์ต่อไปนี้แสดงตัวอย่างของไฟล์คำสั่งที่ประกาศการเชื่อมโยง
ที่มี 2 แอป แยกกันและทำงานอยู่ที่
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"] } }]
แอปต่างๆ อาจจัดการลิงก์สำหรับทรัพยากรต่างๆ ภายใต้เว็บโฮสต์เดียวกัน ตัวอย่างเช่น
app1 อาจประกาศตัวกรอง Intent สำหรับ https://example.com/articles
และ app2 อาจประกาศ
ตัวกรอง Intent ของ https://example.com/videos
หมายเหตุ: แอปหลายรายการที่เชื่อมโยงกับโดเมนหนึ่งอาจลงนามด้วยโดเมนเดียวกัน หรือ ใบรับรองต่างๆ
การเชื่อมโยงเว็บไซต์หลายแห่งกับแอปเดียว
เว็บไซต์หลายแห่งสามารถประกาศการเชื่อมโยงกับแอปเดียวกันในไฟล์ assetlinks.json
ที่เกี่ยวข้อง รายการไฟล์ต่อไปนี้
แสดงตัวอย่างวิธีประกาศการเชื่อมโยงของ example.com และ
example.net ที่มี app1 ข้อมูลแรกแสดงการเชื่อมโยง example.com กับ app1
[{ "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"] } }]
รายการถัดไปแสดงการเชื่อมโยงของ example.net กับ app1 เฉพาะ
ตำแหน่งที่โฮสต์ไฟล์เหล่านี้แตกต่างกัน (.com
และ .net
):
[{ "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"] } }]
การเผยแพร่ไฟล์การยืนยัน JSON
คุณต้องเผยแพร่ไฟล์การยืนยัน JSON ไว้ในตำแหน่งต่อไปนี้
https://domain.name/.well-known/assetlinks.json
โปรดตรวจสอบสิ่งต่อไปนี้
- ไฟล์
assetlinks.json
จะแสดงพร้อมประเภทเนื้อหาapplication/json
- ไฟล์
assetlinks.json
ต้องเข้าถึงได้ผ่านการเชื่อมต่อ HTTPS ไม่ว่าตัวกรอง Intent ของแอปจะประกาศ HTTPS เป็นรูปแบบข้อมูลหรือไม่ก็ตาม - ไฟล์
assetlinks.json
ต้องเข้าถึงได้โดยไม่มีการเปลี่ยนเส้นทางใดๆ (ไม่ใช่ การเปลี่ยนเส้นทาง 301 หรือ 302) - หากลิงก์แอปรองรับโฮสต์โดเมนหลายโดเมน คุณต้องเผยแพร่
assetlinks.json
ไฟล์ในแต่ละโดเมน ดูหัวข้อการรองรับการลิงก์แอปสําหรับโฮสต์หลายราย - อย่าเผยแพร่แอปด้วย URL การพัฒนา/ทดสอบในไฟล์ Manifest ที่อาจไม่ได้ เข้าถึงได้แบบสาธารณะ (เช่น ที่เข้าถึงได้โดยใช้ VPN เท่านั้น) วิธีแก้ปัญหาในกรณีเช่นนี้คือการกำหนดค่าตัวแปรของบิวด์เพื่อสร้างไฟล์ Manifest อื่นสำหรับบิวด์ของนักพัฒนาซอฟต์แวร์
การยืนยัน Android App Link
เมื่อ 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
เว็บไซต์ที่เกี่ยวข้องสำหรับไฟล์ลิงก์เนื้อหาดิจิทัลที่
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
- ไม่มีการบันทึกข้อมูลใดสำหรับโดเมนนี้ รอสักครู่สำหรับ Agent การยืนยันเพื่อดำเนินการคำขอที่เกี่ยวข้องกับการยืนยันโดเมนให้เสร็จสิ้น จากนั้น เรียกใช้กระบวนการยืนยันโดเมนอีกครั้ง
verified
- โดเมนได้รับการยืนยันสําหรับแอปที่ประกาศเรียบร้อยแล้ว
approved
- โดเมนถูกบังคับให้อนุมัติ ซึ่งโดยปกติแล้วจะใช้คำสั่ง Shell
denied
- โดเมนถูกบังคับให้ปฏิเสธ โดยทั่วไปจะเป็นการดำเนินการคำสั่ง Shell
migrated
- ระบบได้เก็บผลลัพธ์ของกระบวนการก่อนหน้าที่ใช้โดเมนเดิมไว้ การยืนยัน
restored
- โดเมนได้รับอนุมัติหลังจากที่ผู้ใช้กู้คืนข้อมูลแล้ว ถือว่ารับแล้ว ที่มีการยืนยันโดเมนก่อนหน้านี้แล้ว
legacy_failure
- ผู้ตรวจสอบเดิมปฏิเสธโดเมน ไม่ทราบสาเหตุที่แน่ชัดของความล้มเหลว
system_configured
- โดเมนได้รับอนุมัติโดยอัตโนมัติจากการกำหนดค่าอุปกรณ์
- รหัสข้อผิดพลาด
1024
ขึ้นไป รหัสข้อผิดพลาดที่กำหนดเองซึ่งเป็นข้อมูลของผู้ยืนยันของอุปกรณ์โดยเฉพาะ
ตรวจสอบอีกครั้งว่าคุณสร้างเครือข่ายแล้ว การเชื่อมต่อ และ เรียกใช้โดเมน กระบวนการยืนยันตัวตนอีกครั้ง
ขอให้ผู้ใช้เชื่อมโยงแอปของคุณกับโดเมน
อีกวิธีหนึ่งที่จะทำให้แอปได้รับอนุมัติสำหรับโดเมนคือการขอให้ผู้ใช้เชื่อมโยงแอปของคุณกับโดเมนนั้น
ตรวจสอบว่าแอปของคุณได้รับอนุมัติสำหรับโดเมนแล้วหรือยัง
ก่อนแจ้งผู้ใช้ ให้ตรวจสอบว่าแอปของคุณเป็นตัวแฮนเดิลเริ่มต้นสำหรับ
โดเมนที่คุณกำหนดในองค์ประกอบ <intent-filter>
คุณสามารถค้นหา
สถานะการอนุมัติโดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
DomainVerificationManager
API (ขณะรันไทม์)- โปรแกรมบรรทัดคำสั่ง (ระหว่างการทดสอบ)
เครื่องมือจัดการการยืนยันโดเมน
ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้ 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
คุณยังใช้คำสั่ง Shell เพื่อจำลองกระบวนการที่ผู้ใช้เลือกได้อีกด้วย
แอปใดที่เชื่อมโยงกับโดเมนหนึ่งๆ คำอธิบายโดยละเอียดเกี่ยวกับ
พร้อมใช้งานจากเอาต์พุตของ 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 เมื่อผู้ใช้เลือกลิงก์ภายในโดเมนที่เพิ่มไว้ภายหลัง ลิงก์นั้นจะเปิดในแอปโดยอัตโนมัติ
เปิดโดเมนในแอปที่แอปของคุณยืนยันไม่ได้
ฟังก์ชันหลักของแอปอาจเป็นการเปิดลิงก์ในฐานะบุคคลที่สามโดยไม่มี ความสามารถในการยืนยันโดเมนที่มีการจัดการ หากเป็นกรณีนี้ ให้อธิบายให้ผู้ใช้ทราบ ที่ในขณะที่ผู้ใช้เลือกเว็บลิงก์ พวกเขาจะไม่สามารถเลือกระหว่าง แอปของบุคคลที่หนึ่งและแอป (ของบุคคลที่สาม) ของคุณ ผู้ใช้ต้องเชื่อมโยงด้วยตนเอง โดเมนกับแอปของบุคคลที่สามของคุณ
นอกจากนี้ ลองแนะนำกิจกรรมการโต้ตอบหรือแทรมโพลีนที่ช่วยให้ ให้ผู้ใช้เปิดลิงก์ในแอปของบุคคลที่หนึ่งหากผู้ใช้ต้องการเปิด ทำหน้าที่เป็นพร็อกซี ก่อนที่จะตั้งค่ากิจกรรมการโต้ตอบหรือแทรมโพลีนดังกล่าว ให้ตั้งค่า ตั้งค่าแอปให้มีการแสดงผลแพ็กเกจ ลงในแอปบุคคลที่หนึ่งที่ตรงกับตัวกรอง Intent สำหรับเว็บของแอป
ทดสอบลิงก์แอป
เมื่อใช้ฟีเจอร์การลิงก์แอป คุณควรทดสอบฟังก์ชันการลิงก์เพื่อ โปรดตรวจสอบว่าระบบสามารถเชื่อมโยงแอปกับเว็บไซต์ และจัดการคำขอ URL ได้ ตามที่คุณคาดไว้
หากต้องการทดสอบไฟล์ใบแจ้งยอดที่มีอยู่ คุณสามารถใช้ เครื่องมือสร้างและผู้ทดสอบของรายการใบแจ้งยอด
ยืนยันรายชื่อโฮสต์ที่จะยืนยัน
เมื่อทดสอบ คุณควรยืนยันรายการโฮสต์ที่เชื่อมโยงซึ่งระบบควรยืนยัน สำหรับแอปของคุณ สร้างรายการ URL ทั้งหมดซึ่งตัวกรอง Intent ที่เกี่ยวข้องมีข้อมูลต่อไปนี้ แอตทริบิวต์และองค์ประกอบ
- แอตทริบิวต์
android:scheme
ที่มีค่าhttp
หรือhttps
- แอตทริบิวต์
android:host
ที่มีรูปแบบ URL ของโดเมน - องค์ประกอบการดำเนินการ
android.intent.action.VIEW
รายการ - องค์ประกอบหมวดหมู่
android.intent.category.BROWSABLE
ใช้รายการนี้เพื่อตรวจสอบว่ามีไฟล์ JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) อยู่ในโฮสต์ที่มีชื่อแต่ละรายการ และโดเมนย่อย
ยืนยันไฟล์ลิงก์เนื้อหาดิจิทัล
สําหรับแต่ละเว็บไซต์ ให้ใช้ Digital Asset Links API เพื่อยืนยันว่า JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) มีการโฮสต์และกำหนดไฟล์อย่างเหมาะสม:
https://digitalassetlinks.googleapis.com/v1/statements:list? source.web.site=https://domain.name:optional_port& relation=delegate_permission/common.handle_all_urls
ดูนโยบายลิงก์
คุณสามารถตรวจสอบการตั้งค่าระบบปัจจุบันสำหรับการจัดการลิงก์ได้ในขั้นตอนการทดสอบ ใช้คำสั่งต่อไปนี้เพื่อดูรายการนโยบายการจัดการลิงก์ที่มีอยู่สำหรับแอปทั้งหมดในอุปกรณ์ที่เชื่อมต่อ
adb shell dumpsys package domain-preferred-apps
หรือตัวอย่างต่อไปนี้ทำหน้าที่เดียวกัน
adb shell dumpsys package d
หมายเหตุ: โปรดรออย่างน้อย 20 วินาทีหลังจากติดตั้งแอปเพื่อ เพื่อให้ระบบดำเนินการยืนยันให้เสร็จสมบูรณ์
คำสั่งจะแสดงรายชื่อของผู้ใช้หรือโปรไฟล์แต่ละรายการที่กำหนดไว้ในอุปกรณ์ นำหน้าด้วยส่วนหัวในรูปแบบต่อไปนี้
App linkages for user 0:
ถัดจากส่วนหัวนี้ เอาต์พุตจะใช้รูปแบบต่อไปนี้เพื่อแสดงการตั้งค่าการจัดการลิงก์สำหรับผู้ใช้รายนั้น
Package: com.android.vending Domains: play.google.com market.android.com Status: always : 200000002
รายการนี้ระบุว่าแอปใดเชื่อมโยงกับโดเมนสำหรับผู้ใช้รายนั้น
Package
- ระบุแอปตามชื่อแพ็กเกจตามที่ประกาศไว้ในไฟล์ ManifestDomains
- แสดงรายการโฮสต์ทั้งหมดซึ่งแอปนี้ลิงก์กับเว็บที่มีการจัดการ โดยใช้ การเว้นวรรคเป็นตัวคั่นStatus
- แสดงการตั้งค่าการจัดการลิงก์ปัจจุบันสําหรับแอปนี้ แอปที่ผ่านการยืนยันและไฟล์ Manifest มีandroid:autoVerify="true"
จะแสดงสถานะเป็นalways
เลขฐานสิบหกที่อยู่หลังสถานะนี้เกี่ยวข้องกับ บันทึกค่ากำหนดการลิงก์แอปของผู้ใช้ ค่านี้ไม่ได้ระบุว่าการยืนยันหรือไม่ สำเร็จ
หมายเหตุ: หากผู้ใช้เปลี่ยนการตั้งค่า App Link สําหรับแอปก่อนการยืนยัน เสร็จสมบูรณ์ คุณอาจเห็นผลบวกลวงคือการยืนยันที่สำเร็จ แม้ว่า การยืนยันไม่สำเร็จ อย่างไรก็ตาม การยืนยันที่ไม่สำเร็จนี้ไม่สำคัญว่าผู้ใช้ เปิดให้แอปเปิดลิงก์ที่รองรับได้โดยไม่ต้องถาม นั่นเป็นเพราะ ค่ากำหนดของผู้ใช้จะมีความสำคัญเหนือกว่าการยืนยันแบบเป็นโปรแกรม (หรือไม่มีการยืนยันแบบเป็นโปรแกรม) ด้วยเหตุนี้ ลิงก์จะไปยังแอปของคุณโดยตรง โดยไม่แสดงกล่องโต้ตอบ เช่นเดียวกับกรณีที่มีการยืนยัน สำเร็จ
ตัวอย่างการทดสอบ
หากต้องการให้การยืนยัน App Link เสร็จสมบูรณ์ ระบบจะต้องยืนยันแอปของคุณด้วย เว็บไซต์ที่คุณระบุในตัวกรอง Intent ที่กำหนดซึ่งตรงกับเกณฑ์สำหรับแอป ลิงก์ ตัวอย่างต่อไปนี้แสดงการกำหนดค่าไฟล์ Manifest ที่มีการกำหนด App Link หลายรายการ
<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>
รายชื่อโฮสต์ที่แพลตฟอร์มจะพยายามยืนยันจากไฟล์ Manifest ด้านบนมีดังนี้
www.example.com mobile.example.com www.example2.com account.example.com
รายชื่อโฮสต์ที่แพลตฟอร์มไม่พยายามยืนยันจากไฟล์ Manifest ด้านบนได้แก่
map.example.com (it does not have android.intent.category.BROWSABLE) market://example.com (it does not have either an "http" or "https" scheme)
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับรายการคำสั่ง โปรดดู การสร้างรายการใบแจ้งยอด
แก้ไขข้อผิดพลาดที่พบบ่อยในการติดตั้งใช้งาน
หากคุณยืนยัน Android App Link ไม่ได้ ให้ตรวจสอบสิ่งต่อไปนี้
ส่วนนี้ใช้ example.com
เป็นชื่อโดเมนตัวยึดตำแหน่ง เมื่อใด
ทำการตรวจสอบเหล่านี้ ให้แทนที่ example.com
ด้วยค่าจริงของเซิร์ฟเวอร์
ชื่อโดเมน
- ตั้งค่าตัวกรอง Intent ไม่ถูกต้อง
- ตรวจสอบว่าคุณได้ใส่ URL ที่แอปของคุณไม่ได้เป็นเจ้าของไว้ใน
<intent-filter>
- การกำหนดค่าเซิร์ฟเวอร์ไม่ถูกต้อง
ตรวจสอบการกําหนดค่า JSON ของเซิร์ฟเวอร์ และตรวจสอบว่าค่า SHA ถูกต้อง
และตรวจสอบว่า
example.com.
(ตามด้วยจุด) แสดงโฆษณาเดียวกัน เนื้อหาเป็นexample.com
- การเปลี่ยนเส้นทางฝั่งเซิร์ฟเวอร์
ระบบจะไม่ยืนยัน Android App Link ใดๆ ในแอปของคุณหากคุณตั้งค่าการเปลี่ยนเส้นทาง เช่น
http://example.com
ถึงhttps://example.com
example.com
ถึงwww.example.com
ลักษณะการทํางานนี้ช่วยปกป้องความปลอดภัยของแอป
- ความแข็งแกร่งของเซิร์ฟเวอร์
ตรวจสอบว่าเซิร์ฟเวอร์เชื่อมต่อกับแอปไคลเอ็นต์ได้หรือไม่
- ลิงก์ที่ยืนยันไม่ได้
คุณอาจตั้งใจเพิ่มลิงก์ที่ยืนยันไม่ได้เพื่อการทดสอบ โปรดทราบว่าใน Android 11 และต่ำกว่า ลิงก์เหล่านี้จะทำให้ระบบไม่ยืนยัน App Link ของ Android ทั้งหมดสําหรับแอปของคุณ
- ลายเซ็นใน assetlinks.json ไม่ถูกต้อง
ตรวจสอบว่าลายเซ็นถูกต้องและตรงกับลายเซ็นที่ใช้ในการลงนาม แอปของคุณ ข้อผิดพลาดที่พบบ่อย ได้แก่
- การรับรองแอปด้วยใบรับรองการแก้ไขข้อบกพร่องและมีเพียงรุ่น
ลายเซ็นใน
assetlinks.json
- มีลายเซ็นตัวพิมพ์เล็กใน
assetlinks.json
ลายเซ็นควร ให้เป็นตัวพิมพ์ใหญ่ - หากคุณใช้ Play App Signing โปรดตรวจสอบว่าคุณใช้ลายเซ็นอยู่ ที่ Google ใช้เพื่อรับรองการเผยแพร่แต่ละรุ่น คุณสามารถยืนยันรายละเอียดเหล่านี้ได้ รวมทั้งข้อมูลโค้ด JSON ที่สมบูรณ์ โดยทำตามวิธีการเกี่ยวกับ การประกาศการเชื่อมโยงเว็บไซต์
- การรับรองแอปด้วยใบรับรองการแก้ไขข้อบกพร่องและมีเพียงรุ่น
ลายเซ็นใน