ยืนยัน App Link

เมื่อมี android:autoVerify="true" ใน Intent Filter ของแอปอย่างน้อย 1 รายการ การติดตั้งแอปในอุปกรณ์ที่ใช้ Android 6.0 (API ระดับ 23) ขึ้นไปจะทำให้ระบบยืนยันโฮสต์ที่เชื่อมโยงกับ URL ใน Intent Filter ของแอปโดยอัตโนมัติ ใน Android 12 ขึ้นไป คุณยังเรียกใช้กระบวนการยืนยันด้วยตนเองเพื่อทดสอบตรรกะการยืนยันได้ด้วย

การยืนยันอัตโนมัติ

การยืนยันอัตโนมัติของระบบเกี่ยวข้องกับสิ่งต่อไปนี้

  1. ระบบจะตรวจสอบตัวกรอง Intent ทั้งหมดที่มีข้อมูลต่อไปนี้
    • การดำเนินการ: android.intent.action.VIEW
    • หมวดหมู่: android.intent.category.BROWSABLE และ android.intent.category.DEFAULT
    • รูปแบบข้อมูล: http หรือ https
  2. สำหรับชื่อโฮสต์ที่ไม่ซ้ำกันแต่ละรายการที่พบในตัวกรอง Intent ด้านบน Android จะค้นหาไฟล์ Digital Asset Links ในเว็บไซต์ที่เกี่ยวข้องที่https:///.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
ไม่มีการบันทึกข้อมูลใดๆ สำหรับโดเมนนี้ รออีกสักครู่เพื่อให้ ตัวแทนการยืนยันดำเนินการตามคำขอที่เกี่ยวข้องกับการยืนยันโดเมนให้เสร็จสิ้น จากนั้นเรียกใช้กระบวนการยืนยันโดเมนอีกครั้ง
verified
โดเมนได้รับการยืนยันสําหรับแอปที่ประกาศเรียบร้อยแล้ว
approved
โดเมนได้รับการอนุมัติโดยบังคับ ซึ่งมักจะเกิดจากการเรียกใช้คำสั่งเชลล์
denied
โดเมนถูกปฏิเสธโดยบังคับ ซึ่งมักเกิดจากการเรียกใช้คำสั่งเชลล์
migrated
ระบบได้เก็บผลลัพธ์ของกระบวนการก่อนหน้านี้ที่ใช้การยืนยันโดเมนเดิมไว้
restored
โดเมนได้รับการอนุมัติหลังจากที่ผู้ใช้กู้คืนข้อมูล ระบบจะถือว่าโดเมนได้รับการยืนยันแล้วก่อนหน้านี้
legacy_failure
โดเมนถูกปฏิเสธโดยเครื่องมือตรวจสอบเวอร์ชันเดิม ไม่ทราบสาเหตุที่เฉพาะเจาะจงที่ทำให้เกิดความล้มเหลว
system_configured
โดเมนได้รับการอนุมัติโดยอัตโนมัติจากการกำหนดค่าอุปกรณ์
รหัสข้อผิดพลาด 1024 ขึ้นไป

รหัสข้อผิดพลาดที่กำหนดเองซึ่งเฉพาะเจาะจงสำหรับเครื่องมือยืนยันของอุปกรณ์

โปรดตรวจสอบอีกครั้งว่าคุณได้สร้างการเชื่อมต่อเครือข่ายแล้ว และเรียกใช้กระบวนการยืนยันโดเมนอีกครั้ง

ขอให้ผู้ใช้เชื่อมโยงแอปของคุณกับโดเมน

อีกวิธีหนึ่งที่แอปจะได้รับการอนุมัติสำหรับโดเมนคือการขอให้ผู้ใช้ เชื่อมโยงแอปกับโดเมนนั้น

ตรวจสอบว่าแอปของคุณได้รับอนุมัติสำหรับโดเมนแล้วหรือไม่

ก่อนที่จะแจ้งให้ผู้ใช้ดำเนินการ ให้ตรวจสอบว่าแอปของคุณเป็นตัวแฮนเดิลเริ่มต้นสำหรับ โดเมนที่คุณกำหนดไว้ในองค์ประกอบ <intent-filter> หรือไม่ คุณสามารถค้นหาสถานะการอนุมัติได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้

  • DomainVerificationManager API (ที่รันไทม์)
  • โปรแกรมบรรทัดคำสั่ง (ระหว่างการทดสอบ)

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 เมื่อผู้ใช้เลือก ลิงก์ใดก็ตามภายในโดเมนที่เพิ่มในภายหลัง ลิงก์จะเปิดในแอปของคุณ โดยอัตโนมัติ

เมื่อเปิดใช้ปุ่มตัวเลือก ส่วนที่อยู่ใกล้ด้านล่าง
    จะมีช่องทําเครื่องหมายและปุ่มที่ชื่อ &quot;เพิ่มลิงก์&quot;
รูปที่ 1 หน้าจอการตั้งค่าระบบที่ผู้ใช้เลือกได้ว่าลิงก์ใดจะเปิดในแอปของคุณโดยค่าเริ่มต้น
ช่องทําเครื่องหมายแต่ละช่องแสดงถึงโดเมนที่คุณเพิ่มได้ ปุ่มในกล่องโต้ตอบ
    คือ &quot;ยกเลิก&quot; และ &quot;เพิ่ม&quot;
รูปที่ 2 กล่องโต้ตอบที่ผู้ใช้เลือกโดเมนเพิ่มเติม เพื่อเชื่อมโยงกับแอปของคุณได้

เปิดโดเมนในแอปที่แอปยืนยันไม่ได้

ฟังก์ชันหลักของแอปอาจเป็นการเปิดลิงก์ในฐานะบุคคลที่สามโดยไม่มีความสามารถในการยืนยันโดเมนที่จัดการ ในกรณีนี้ ให้แจ้งผู้ใช้ว่า เมื่อเลือกเว็บลิงก์ในขณะนั้น ผู้ใช้จะเลือกไม่ได้ระหว่าง แอปของบุคคลที่หนึ่งกับแอปของคุณ (บุคคลที่สาม) ผู้ใช้ต้องเชื่อมโยงโดเมนกับแอปของบุคคลที่สามด้วยตนเอง

นอกจากนี้ ให้พิจารณาแสดงกล่องโต้ตอบหรือกิจกรรมแทรมโพลีนที่อนุญาตให้ผู้ใช้เปิดลิงก์ในแอปของบุคคลที่หนึ่งหากผู้ใช้ต้องการทำเช่นนั้น โดยทำหน้าที่เป็นพร็อกซี ก่อนที่จะตั้งค่ากล่องโต้ตอบหรือกิจกรรม Trampoline ดังกล่าว ให้ตั้งค่าแอปเพื่อให้มีระดับการมองเห็นแพ็กเกจ ในแอปของบุคคลที่หนึ่งที่ตรงกับตัวกรอง Intent บนเว็บของแอป