หากต้องการรองรับ App Link คุณต้องสร้างไฟล์ JSON ของลิงก์เนื้อหาดิจิทัล
ที่ชื่อ assetlinks.json และเผยแพร่ในตำแหน่งที่รู้จักกันดีบน
เว็บไซต์ ไฟล์นี้จะประกาศต่อสาธารณะว่าแอปใดได้รับอนุญาตให้จัดการลิงก์สำหรับโดเมนของคุณ และอุปกรณ์ Android จะดึงไฟล์นี้จากเซิร์ฟเวอร์ของคุณเพื่อยืนยัน Deep Link
สำหรับ App Link แบบไดนามิกใน Android 15 ขึ้นไป ไฟล์ assetlinks.json ยังเป็น
ที่ที่คุณกำหนดค่ากฎแบบไดนามิกเช่น ตัวจับคู่รูปแบบ
สำหรับเส้นทาง ส่วนย่อย และพารามิเตอร์การค้นหา อุปกรณ์ Android ที่ใช้ Android 15 (ระดับ API 35) ขึ้นไปซึ่งติดตั้งบริการของ Google จะดึงไฟล์นี้เป็นระยะๆ และผสานการกำหนดค่าแบบไดนามิกกับการกำหนดค่าแบบคงที่ในไฟล์ Manifest ของแอป
คู่มือนี้จะอธิบายวิธีเตรียมไฟล์ assetlinks.json และเผยแพร่ในเว็บไซต์ หากต้องการ คุณสามารถสร้างไฟล์ assetlinks.json จากเครื่องมือ Play Deep Links หรือผู้ช่วย App Link ของ Android Studio ก็ได้
ดูข้อมูลเพิ่มเติมได้ที่ เครื่องมือสำหรับนักพัฒนา App Link
ประกาศการเชื่อมโยงเว็บไซต์
คุณต้องเผยแพร่ไฟล์ JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ใน เว็บไซต์เพื่อระบุแอป Android ที่เชื่อมโยงกับเว็บไซต์และ ยืนยัน Intent ของ URL ของแอป ไฟล์ JSON ใช้ฟิลด์ต่อไปนี้เพื่อระบุแอปที่เชื่อมโยง
package_name: รหัสแอปพลิเคชันที่ประกาศไว้ในbuild.gradleไฟล์ของแอปsha256_cert_fingerprints: ลายนิ้วมือ SHA256 ในใบรับรองการลงนามของแอป คุณสามารถใช้คำสั่งต่อไปนี้เพื่อสร้างลายนิ้วมือโดยใช้ Java Keytool
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 ต่อไปนี้ให้สิทธิ์ในการเปิดลิงก์แก่แอป 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"]
}
}]
กำหนดค่ากฎแบบไดนามิก
App Link แบบไดนามิกใน Android 15 ขึ้นไปช่วยให้คุณใช้กฎการจับคู่ Deep Link ฝั่งเซิร์ฟเวอร์ที่ทำงานร่วมกับกฎที่คุณกำหนดแบบคงที่ในไฟล์ Manifest ของแอปได้ ไฟล์ assetlinks.json เป็นที่ที่คุณกำหนดกฎแบบไดนามิก การรวมกฎแบบไดนามิกไว้ในไฟล์ `assetlinks.json` เป็นตัวเลือก
อุปกรณ์ Android ที่ใช้ Android 15 (ระดับ API 35) ขึ้นไปซึ่งติดตั้งบริการของ Google จะดึงไฟล์นี้จากเซิร์ฟเวอร์ของคุณเป็นระยะๆ และผสานการกำหนดค่ากฎแบบไดนามิกกับการกำหนดค่าแบบคงที่ในไฟล์ Manifest ของแอป ตัวอย่างต่อไปนี้แสดงไฟล์ assetlinks.json ที่มีกฎแบบไดนามิก
[
{
"relation": [
"delegate_permission/common.handle_all_urls"
],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": [...]
},
"relation_extensions": {
"delegate_permission/common.handle_all_urls": {
"dynamic_app_link_components": [
{"?": {"dl": "*"}},
{"#": "app"},
{"/": "/products/*"},
{"/": "/shoes", "?": {"in_app": "true"}},
{"/": "*", "exclude": true}
]
}
}
}
]
ประเด็นสำคัญเกี่ยวกับโค้ด
- App Link แบบไดนามิกเพิ่มส่วนขยายความสัมพันธ์ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ใหม่ที่เรียกว่า
dynamic_app_link_componentsซึ่งเป็นที่ที่คุณกำหนดค่ากฎแบบไดนามิก - กฎแบบไดนามิกสามารถมีตัวจับคู่รูปแบบสำหรับเส้นทาง ส่วนย่อย และพารามิเตอร์การค้นหา
- นอกจากนี้ คุณยังทำเครื่องหมายตัวจับคู่รูปแบบใดก็ได้เป็นตัวจับคู่ที่ยกเว้น เพื่อไม่ให้ URL ที่ตรงกันเปิดแอป
- ตัวอย่างนี้แสดงตัวอย่างตัวจับคู่สำหรับเส้นทาง (
"/") ส่วนย่อย ("#") และพารามิเตอร์การค้นหา ("?") รวมถึงตัวจับคู่ที่ยกเว้น ("exclude") - หากฟิลด์ใดๆ ในไฟล์มีรูปแบบไม่ถูกต้องหรือว่างเปล่า Android จะทิ้งกฎแบบไดนามิกและอุปกรณ์จะกลับไปใช้กฎที่กำหนดแบบคงที่ในไฟล์ Manifest ของแอป
กฎแบบไดนามิกสามารถระบุกฎที่ใช้ได้ภายในขอบเขตของโดเมนที่คุณประกาศในไฟล์ Manifest ของแอปเท่านั้น ดูส่วน ประกาศกฎแบบไดนามิก
ประกาศกฎแบบไดนามิก
App Link แบบไดนามิกรองรับส่วนขยายความสัมพันธ์ dynamic_app_link_components ใหม่ ซึ่งมีอาร์เรย์ของออบเจ็กต์กฎ กฎแต่ละข้อกำหนดโดยใช้ตัวจับคู่รูปแบบสำหรับเส้นทาง ส่วนย่อย และพารามิเตอร์การค้นหาที่จะเปิดแอป นอกจากนี้ คุณยังยกเว้นตัวจับคู่แต่ละรายการได้ด้วย เพื่อไม่ให้ตัวจับคู่เหล่านั้นเปิดแอป ทั้งหมดนี้เป็นตัวเลือก
- การจับคู่เส้นทาง
- คีย์: "/"
- ค่า: สตริงเดียว, นิพจน์การจับคู่สำหรับเส้นทาง URL
- การจับคู่ส่วนย่อย
- คีย์: "#"
- ค่า: สตริงเดียว, นิพจน์การจับคู่สำหรับส่วนย่อย URL
- การจับคู่พารามิเตอร์การค้นหา
- คีย์: "?"
- ค่า: พจนานุกรมเพื่อจับคู่คู่คีย์/ค่าในพารามิเตอร์การค้นหาของ URL
- เช่น พจนานุกรม {"
?", {"dl": "*", "in_app":"true"} จะจับคู่ สตริงการค้นหา "?in_app=true&dl=abc" - ลำดับของคู่คีย์/ค่าในพจนานุกรมไม่จำเป็นต้องตรงกับลำดับของคู่ในสตริงการค้นหา นอกจากนี้ พจนานุกรมไม่จำเป็นต้องจับคู่คู่คีย์/ค่าทั้งหมดในสตริงการค้นหา แต่ต้องพบการจับคู่สำหรับรายการพจนานุกรมทุกรายการ
- เช่น พจนานุกรมจะจับคู่สตริงการค้นหา
"
?lang=en&in_app=true&tz=pst&dl=abc" ด้วย แต่จะไม่จับคู่สตริงการค้นหา "?lang=en&tz=pst&dl=abc"
- ยกเว้น
- คีย์: "exclude"
- ค่า: ค่าจริง/เท็จที่เป็นตัวเลือกสำหรับกฎแต่ละข้อที่กำหนดไว้ใน
dynamic_app_link_components(ดูตัวอย่าง)
คุณสามารถใช้อักขระพิเศษต่อไปนี้ในตัวจับคู่รูปแบบ
- "*" จะจับคู่อักขระ 0 ตัวขึ้นไปจนกว่าจะพบอักขระหลังไวลด์การ์ดในรูปแบบในสตริงที่ตรงกัน
- "?" จะจับคู่อักขระเดียว
- "?*" จะจับคู่อักขระ 1 ตัวขึ้นไป
ค่าไม่มีข้อจำกัดด้านอักขระอื่นๆ
จัดลำดับกฎแบบไดนามิก
ลำดับที่ประกาศกฎมีความสำคัญ Android จะประเมินกฎแต่ละข้อตามลำดับจนกว่าจะพบรายการที่ตรงกัน
ตัวอย่างต่อไปนี้แสดงให้เห็นว่าการจัดลำดับอาจส่งผลต่อการจัดการอย่างไร กฎแรกจะจับคู่เส้นทางทั้งหมด ("*") แต่ยกเว้นรายการที่ตรงกัน (exclude: true) ซึ่งหมายความว่าจะยกเว้น URL ทั้งหมดไม่ให้เปิดแอป ในกรณีนี้ ระบบจะไม่ประเมินกฎที่ 2 ซึ่งอนุญาต "/path1" เลย
dynamic_app_link_components: [
{"/": "*", "exclude": true},
{"/": "/path1"}
]
อย่างไรก็ตาม ในตัวอย่างถัดไป ระบบจะประกาศกฎ "/path1" ก่อน ดังนั้นระบบจะประเมินกฎนี้ก่อนและจะเปิดแอปสำหรับ URL ที่ตรงกับ "/path1" ระบบจะประเมินกฎที่ 2 ซึ่งยกเว้น URL ทั้งหมดไม่ให้เปิดแอปเป็นกฎที่ 2 แต่จะประเมินก็ต่อเมื่อกฎแรกไม่ตรงกัน
dynamic_app_link_components: [
{"/": "/path1"},
{"/": "*", "exclude": true}
]
หากไม่พบรายการที่ตรงกันในรายการคอมโพเนนต์ที่ประกาศไว้ URL จะไม่เปิดแอป ในตัวอย่างต่อไปนี้ ไม่มีเส้นทางใดที่ตรงกับ "/path3" ดังนั้นอุปกรณ์จะถือว่าเส้นทางนี้เป็นเส้นทางที่ยกเว้น
dynamic_app_link_components: [
{"/": "/path1"},
{"/": "/path2"}
]
ลักษณะการทำงานนี้มีความสำคัญหากคุณต้องการให้ dynamic_app_link_components ยกเว้นเฉพาะบางส่วนของ URL แต่ให้ส่วนอื่นๆ ทั้งหมด ในตัวอย่างต่อไปนี้ การละเว้นกฎสุดท้ายเพื่ออนุญาตเส้นทางที่เหลือทั้งหมดจะหมายความว่า URL ทั้งหมดจะถูกยกเว้นจากแอป
dynamic_app_link_components: [
{"/": "/path1", "exclude": true},
{"/": "*"}
]
กำหนดขอบเขตของกฎแบบไดนามิกอย่างเหมาะสม
เมื่อกำหนดกฎฝั่งเซิร์ฟเวอร์เพื่อใช้กับ App Link แบบไดนามิกใน Android 15 ขึ้นไป คุณต้องกำหนดขอบเขตของกฎอย่างเหมาะสม เพื่อให้กฎทำงานร่วมกับและเสริมตัวกรอง Intent แบบคงที่ที่ประกาศไว้ในไฟล์ Manifest ของแอป
กฎแบบไดนามิกที่ประกาศไว้ในไฟล์ assetlinks.json สามารถระบุกฎสำหรับโฮสต์ที่คุณประกาศไว้ในไฟล์ AndroidManifest.xml ของแอปเท่านั้น กฎแบบไดนามิกไม่สามารถขยายขอบเขตของกฎ URL ที่คุณประกาศแบบคงที่ในไฟล์ Manifest ของแอป
ด้วยเหตุนี้ เราจึงแนะนำให้ใช้แนวทางนี้กับกฎแบบไดนามิกและกฎแบบคงที่
- ในไฟล์ Manifest ของแอป ให้ตั้งกฎที่มีขอบเขตกว้างที่สุดเท่าที่จะเป็นไปได้ เช่น การประกาศเฉพาะสคีมและโดเมน
- ใช้กฎแบบไดนามิกฝั่งเซิร์ฟเวอร์เพื่อปรับแต่งเพิ่มเติม เช่น การกำหนดเส้นทางระดับเส้นทาง
การกำหนดค่าที่เหมาะสมนี้จะช่วยให้คุณเพิ่มเส้นทาง App Link ใหม่แบบไดนามิกในไฟล์ assetlinks.json ได้ตามต้องการ โดยมั่นใจได้ว่าเส้นทางเหล่านั้นจะอยู่ในขอบเขตกว้างที่คุณตั้งไว้ในไฟล์ Manifest ของแอป
ประกาศ dynamic_app_link_components เพียงครั้งเดียว
หากต้องการจัดการกฎอย่างเหมาะสม ให้ประกาศออบเจ็กต์ dynamic_app_link_components เพียงรายการเดียวในคำสั่งสำหรับเว็บไซต์ ความสัมพันธ์ และแอปที่กำหนด
- มองหาคำสั่งหลายรายการสำหรับเว็บไซต์ ความสัมพันธ์ และแอปเดียวกันที่ประกาศออบเจ็กต์ dynamic_app_link_components
- มองหาออบเจ็กต์ dynamic_app_link_components หลายรายการที่ประกาศไว้ในคำสั่งเดียว
ในกรณีเช่นนี้ Android ไม่รับประกันว่าจะใช้การกำหนดค่ากฎแบบไดนามิกใด
ความเข้ากันได้ของกฎแบบไดนามิกกับการกำหนดค่า App Link ก่อนหน้า
หากคุณรองรับ App Link อยู่แล้ว คุณสามารถเพิ่มการรองรับ App Link แบบไดนามิกได้โดยตรงในไฟล์ assetlinks.json ที่มีอยู่ ฟิลด์ความสัมพันธ์สำหรับการยืนยัน App Link จะยังคงเหมือนเดิม และคุณสามารถเพิ่มฟิลด์ส่วนขยายความสัมพันธ์ใหม่สำหรับกฎแบบไดนามิกได้โดยไม่ต้องทำการเปลี่ยนแปลงอื่นๆ
อุปกรณ์ Android ที่ใช้ Android 14 (ระดับ API 34 หรือต่ำกว่า) จะไม่สนใจฟิลด์ส่วนขยายความสัมพันธ์ใหม่สำหรับกฎแบบไดนามิก ในขณะที่อุปกรณ์ที่ใช้ Android 15 ขึ้นไปจะผสานกฎเหล่านั้นกับกฎที่กำหนดไว้ในไฟล์ Manifest
เผยแพร่ไฟล์ JSON สำหรับการยืนยัน
คุณต้องเผยแพร่ไฟล์ JSON สำหรับการยืนยันในตำแหน่งต่อไปนี้
https://domain.name/.well-known/assetlinks.json
ตรวจสอบสิ่งต่อไปนี้
- ไฟล์
assetlinks.jsonแสดงโดยมีประเภทเนื้อหาเป็นapplication/json - ไฟล์
assetlinks.jsonต้องเข้าถึงได้ผ่านการเชื่อมต่อ HTTPS ไม่ว่าตัวกรอง Intent ของแอปจะประกาศ HTTPS เป็นรูปแบบข้อมูลหรือไม่ก็ตาม - ไฟล์
assetlinks.jsonต้องเข้าถึงได้โดยไม่มีการเปลี่ยนเส้นทาง (ไม่มีการเปลี่ยนเส้นทาง 301 หรือ 302) - หาก App Link รองรับโดเมนโฮสต์หลายโดเมน คุณต้องเผยแพร่ไฟล์
assetlinks.jsonในแต่ละโดเมน ดู การรองรับการลิงก์แอปสำหรับ โฮสต์หลายรายการ - อย่าเผยแพร่แอปด้วย URL ทดสอบในไฟล์ Manifest ที่สาธารณะอาจเข้าถึงไม่ได้ (เช่น URL ที่เข้าถึงได้ด้วย VPN เท่านั้น) วิธีแก้ปัญหาในกรณีเช่นนี้คือการกำหนดค่าบิลด์ย่อยเพื่อสร้างไฟล์ Manifest ที่แตกต่างกันสำหรับบิลด์สำหรับนักพัฒนาแอป
ดูคำแนะนำที่เกี่ยวข้องต่อไปนี้