ยืนยัน Android App Link

Android App Link เป็น Deep Link ประเภทพิเศษที่ช่วยให้ URL ของเว็บไซต์ เพื่อเปิดเนื้อหาที่เกี่ยวข้องในแอป Android ทันที การกำหนดให้ผู้ใช้เลือกแอป Android App Link ใช้เนื้อหาดิจิทัล API ลิงก์ เพื่อสร้างความน่าเชื่อถือ ที่แอปได้รับอนุมัติจากเว็บไซต์ให้เปิดลิงก์โดยอัตโนมัติให้ โดเมนนั้น หากระบบยืนยันว่าคุณเป็นเจ้าของ URL สำเร็จแล้ว ระบบจะดำเนินการ ระบบจะกำหนดเส้นทาง Intent URL เหล่านั้นไปยังแอปของคุณโดยอัตโนมัติ

หากต้องการยืนยันว่าคุณเป็นเจ้าของ URL ของทั้งแอปและเว็บไซต์ ให้กรอกลิงก์ ขั้นตอนต่อไปนี้

  1. เพิ่มตัวกรอง Intent ที่มีแอตทริบิวต์ autoVerify แอตทริบิวต์นี้ส่งสัญญาณไปยังระบบว่าควรตรวจสอบว่า แอปของคุณอยู่ในโดเมน URL ที่ใช้ในตัวกรอง Intent

  2. ประกาศการเชื่อมโยงระหว่างเว็บไซต์กับความตั้งใจของคุณ กรองได้โดยโฮสต์ไฟล์ 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

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

รายการถัดไปแสดงการเชื่อมโยงของ example.net กับ app1 เฉพาะ ตำแหน่งที่โฮสต์ไฟล์เหล่านี้แตกต่างกัน (.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"]
  }
}]

การเผยแพร่ไฟล์การยืนยัน 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 ขึ้นไป คุณ ยังเรียกใช้กระบวนการยืนยันตัวตนด้วยตนเองเพื่อ ทดสอบตรรกะการยืนยัน

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

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

  1. ระบบจะตรวจสอบตัวกรอง Intent ทั้งหมดที่มีสิ่งต่อไปนี้
    • การทำงาน: android.intent.action.VIEW
    • หมวดหมู่: android.intent.category.BROWSABLE และ android.intent.category.DEFAULT
    • รูปแบบข้อมูล: http หรือ https
  2. สำหรับชื่อโฮสต์ที่ไม่ซ้ำกันแต่ละชื่อที่พบในตัวกรอง 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 เมื่อผู้ใช้เลือกลิงก์ภายในโดเมนที่เพิ่มไว้ภายหลัง ลิงก์นั้นจะเปิดในแอปโดยอัตโนมัติ

เมื่อเปิดใช้ปุ่มตัวเลือก ส่วนที่ใกล้กับด้านล่าง
    มีช่องทำเครื่องหมายและปุ่ม &quot;เพิ่มลิงก์&quot;
รูปที่ 1 หน้าจอการตั้งค่าระบบที่ผู้ใช้สามารถเลือกได้ ซึ่งจะเปิดในแอปโดยค่าเริ่มต้นได้
ช่องทำเครื่องหมายแต่ละช่องจะแสดงโดเมนที่คุณสามารถเพิ่มได้ ปุ่มของกล่องโต้ตอบคือ &quot;ยกเลิก&quot; และ &quot;เพิ่ม&quot;
รูปที่ 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 - ระบุแอปตามชื่อแพ็กเกจตามที่ประกาศไว้ในไฟล์ Manifest
  • Domains - แสดงรายการโฮสต์ทั้งหมดซึ่งแอปนี้ลิงก์กับเว็บที่มีการจัดการ โดยใช้ การเว้นวรรคเป็นตัวคั่น
  • 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 ที่สมบูรณ์ โดยทำตามวิธีการเกี่ยวกับ การประกาศการเชื่อมโยงเว็บไซต์