ยืนยัน Android App Link

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

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

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

  2. ประกาศการเชื่อมโยงระหว่างเว็บไซต์กับตัวกรอง 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". -->
    <!-- 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>

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

กระบวนการยืนยันโดเมนต้องใช้การเชื่อมต่ออินเทอร์เน็ตและอาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์ ระบบจะยืนยันโดเมนสำหรับแอปที่กำหนดเป้าหมายเป็น Android 12 ขึ้นไป ก็ต่อเมื่อโดเมนนั้นอยู่ภายในองค์ประกอบ <intent-filter> ที่มี รูปแบบที่แน่นอนซึ่งระบุไว้ในข้อมูลโค้ดก่อนหน้าเท่านั้น เพื่อช่วยปรับปรุงประสิทธิภาพของกระบวนการ เช่น รูปแบบอื่นที่ไม่ใช่ "http" และ "https" เช่น <data android:scheme="custom" /> จะป้องกันไม่ให้ <intent-filter> จาก ทริกเกอร์การยืนยันโดเมน

รองรับการลิงก์แอปสำหรับโฮสต์หลายราย

ระบบต้องยืนยันโฮสต์ที่ระบุในองค์ประกอบข้อมูลของตัวกรอง Intent ของ URL ของแอปกับไฟล์ Digital Asset Links ที่โฮสต์ในโดเมนเว็บที่เกี่ยวข้องในตัวกรอง Intent นั้นได้ หากการยืนยันล้มเหลว ระบบจะกลับไปใช้ลักษณะการทำงานมาตรฐาน เพื่อแก้ไขความตั้งใจตามที่อธิบายไว้ใน สร้าง Deep Link ไปยังเนื้อหาแอป อย่างไรก็ตาม ระบบจะยังคงยืนยันแอปเป็นตัวแฮนเดิลเริ่มต้น สำหรับรูปแบบ URL ใดก็ตามที่กำหนดไว้ในตัวกรอง Intent อื่นๆ ของแอป

หมายเหตุ: ใน Android 11 (API ระดับ 30) และต่ำกว่า ระบบ จะไม่ยืนยันว่าแอปของคุณเป็นตัวแฮนเดิลเริ่มต้น เว้นแต่จะพบไฟล์ลิงก์เนื้อหาดิจิทัลที่ตรงกันสำหรับโฮสต์ทั้งหมดที่คุณกำหนดใน 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> อื่นๆ เพื่อให้ตัวกรอง เจตนารองรับทั้ง http://www.example.com และ https://www.example.com ดังนั้น คุณต้องสร้างตัวกรอง Intent แยกต่างหากเมื่อต้องการกำหนดชุดค่าผสมที่เฉพาะเจาะจง ของรูปแบบ URI และโดเมน

รองรับการลิงก์แอปสำหรับโดเมนย่อยหลายโดเมน

โปรโตคอลลิงก์เนื้อหาดิจิทัลจะถือว่าโดเมนย่อยในตัวกรอง 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 และเวอร์ชันเต็ม จะมีเพียงแอปที่ติดตั้งล่าสุดเท่านั้นที่สามารถระบุ Web Intent สำหรับโดเมนนั้นได้

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

ประกาศการเชื่อมโยงเว็บไซต์

คุณต้องเผยแพร่ไฟล์ JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ในเว็บไซต์เพื่อระบุแอป 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 สำหรับแอปในบัญชีนักพัฒนาแอป Play Console หรือไม่ได้ที่ส่วน Release > Setup > App signing หากใช้ คุณจะเห็น ข้อมูลโค้ด JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ที่ถูกต้องสำหรับแอปในหน้าเดียวกันด้วย

ตัวอย่างไฟล์ assetlinks.json ต่อไปนี้จะให้สิทธิ์ในการเปิดลิงก์แก่แอป 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"]
  }
}]

การเชื่อมโยงเว็บไซต์กับแอปหลายแอป

เว็บไซต์สามารถประกาศการเชื่อมโยงกับแอปหลายแอปภายในไฟล์ 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 ซึ่งอาจเข้าถึงไม่ได้สำหรับสาธารณะ (เช่น URL ที่เข้าถึงได้ด้วย VPN เท่านั้น) วิธีแก้ปัญหาในกรณีดังกล่าวคือการกำหนดค่าตัวแปรของบิลด์เพื่อสร้างไฟล์ Manifest อื่นสำหรับบิลด์สำหรับนักพัฒนาแอป

การยืนยัน Android App Links

เมื่อมี 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://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 Links ในอุปกรณ์

ก่อนที่จะเรียกใช้การยืนยันโดเมนในอุปกรณ์ด้วยตนเอง คุณต้องรีเซ็ต สถานะของ Android App Links ในอุปกรณ์ทดสอบ โดยเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล

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 บนเว็บของแอป

ทดสอบลิงก์แอป

เมื่อใช้ฟีเจอร์การลิงก์แอป คุณควรทดสอบฟังก์ชันการลิงก์เพื่อให้แน่ใจว่าระบบสามารถเชื่อมโยงแอปกับเว็บไซต์ของคุณ และจัดการคำขอ 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)

สำหรับแต่ละเว็บไซต์ ให้ใช้ 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 - แสดงการตั้งค่าการจัดการลิงก์ปัจจุบันสำหรับแอปนี้ แอปที่ ผ่านการยืนยันและมี android:autoVerify="true" ในไฟล์ Manifest จะแสดงสถานะเป็น always หมายเลขฐานสิบหกหลังจากสถานะนี้เกี่ยวข้องกับบันทึกค่ากำหนดการลิงก์แอปของผู้ใช้ในระบบ Android ค่านี้ไม่ได้บ่งบอกว่าการยืนยัน สำเร็จหรือไม่

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

ตัวอย่างการทดสอบ

หากต้องการให้การยืนยัน App Link สำเร็จ ระบบต้องยืนยันแอปของคุณกับเว็บไซต์แต่ละแห่งที่คุณระบุในตัวกรอง Intent ที่กำหนดซึ่งเป็นไปตามเกณฑ์สำหรับ App Link ได้ ตัวอย่างต่อไปนี้แสดงการกำหนดค่าไฟล์ 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 Links ไม่ได้ ให้ตรวจสอบข้อผิดพลาดทั่วไปต่อไปนี้ ส่วนนี้ใช้ 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 และเวอร์ชันที่ต่ำกว่า ลิงก์เหล่านี้จะทำให้ระบบไม่ยืนยัน Android App Link ทั้งหมดสำหรับแอปของคุณ

ลายเซ็นในไฟล์ assetlinks.json ไม่ถูกต้อง

ตรวจสอบว่าลายเซ็นถูกต้องและตรงกับลายเซ็นที่ใช้ลงนามในแอป ข้อผิดพลาดที่พบบ่อย ได้แก่

  • การลงนามในแอปด้วยใบรับรองการแก้ไขข้อบกพร่องและมีลายเซ็นรุ่นที่เผยแพร่ใน assetlinks.json เท่านั้น
  • การมีลายเซ็นตัวพิมพ์เล็กใน assetlinks.json ลายเซ็นควร เป็นตัวพิมพ์ใหญ่
  • หากใช้ Play App Signing โปรดตรวจสอบว่าคุณใช้ลายเซ็น ที่ Google ใช้ในการรับรองรุ่นของคุณแต่ละรุ่น คุณยืนยันรายละเอียดเหล่านี้ รวมถึงข้อมูลโค้ด JSON ที่สมบูรณ์ได้โดยทำตามวิธีการเกี่ยวกับการประกาศการเชื่อมโยงเว็บไซต์