หากต้องการรองรับ App Link คุณต้องสร้างไฟล์ JSON ของ Digital Asset Links
ที่ชื่อ assetlinks.json
แล้วเผยแพร่ในตำแหน่งที่รู้จักกันดีใน
เว็บไซต์ ไฟล์นี้จะประกาศต่อสาธารณะว่าแอปใดได้รับอนุญาตให้จัดการ
ลิงก์สำหรับโดเมนของคุณ และอุปกรณ์ Android จะเรียกไฟล์นี้จากเซิร์ฟเวอร์
เพื่อยืนยัน Deep Link
สำหรับ App Link แบบไดนามิกใน Android 15 ขึ้นไป assetlinks.json
ยังเป็นที่ที่คุณกำหนดค่ากฎแบบไดนามิก เช่น ตัวจับคู่รูปแบบ
สำหรับเส้นทาง ส่วนย่อย และพารามิเตอร์การค้นหา อุปกรณ์ Android ที่ใช้ Android 15
(API ระดับ 35) ขึ้นไปซึ่งติดตั้งบริการของ Google จะเรียกข้อมูลไฟล์เป็นระยะๆ
และผสานการกำหนดค่าแบบไดนามิกกับการกำหนดค่าแบบคงที่
ใน Manifest ของแอป
คู่มือนี้จะอธิบายวิธีเตรียมไฟล์ assetlinks.json
และเผยแพร่ไฟล์ดังกล่าวในเว็บไซต์ หากต้องการ คุณสามารถสร้างassetlinks.json
ไฟล์จากเครื่องมือ Play Deep Link หรือผู้ช่วย App Link ของ Android Studio ได้
ดูข้อมูลเพิ่มเติมได้ที่เครื่องมือสำหรับนักพัฒนาแอป App Links
ประกาศการเชื่อมโยงเว็บไซต์
คุณต้องเผยแพร่ไฟล์ JSON ของลิงก์เนื้อหาดิจิทัล (Digital Asset Links) ในเว็บไซต์เพื่อระบุแอป Android ที่เชื่อมโยงกับเว็บไซต์และยืนยันความตั้งใจของ URL ของแอป ไฟล์ JSON ใช้ช่องต่อไปนี้เพื่อ ระบุแอปที่เชื่อมโยง
package_name
: รหัสแอปพลิเคชันที่ประกาศในไฟล์build.gradle
ของแอปsha256_cert_fingerprints
: ลายนิ้วมือ SHA256 ของใบรับรองการลงนามของแอป คุณใช้คำสั่งต่อไปนี้เพื่อสร้างลายนิ้วมือได้ โดยใช้เครื่องมือคีย์ของ Java
keytool -list -v -keystore my-release-key.keystore
- ฟิลด์นี้รองรับลายนิ้วมือหลายรายการ ซึ่งสามารถใช้เพื่อรองรับแอปเวอร์ชันต่างๆ เช่น บิลด์สำหรับดีบักและเวอร์ชันที่ใช้งานจริง หากคุณใช้การลงนามในแอป Play สำหรับแอป ลายนิ้วมือของใบรับรองที่สร้างขึ้นจากการเรียกใช้
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"]
}
}]
กำหนดค่ากฎแบบไดนามิก
Dynamic App Link ใน Android 15 ขึ้นไปช่วยให้คุณใช้กฎการจับคู่ Deep Link ฝั่งเซิร์ฟเวอร์
ที่ทำงานร่วมกับกฎที่คุณกำหนดแบบคงที่ในไฟล์ Manifest ของแอป
ได้ ไฟล์ 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 แบบไดนามิกจะเพิ่มส่วนขยายความสัมพันธ์ของลิงก์เนื้อหาดิจิทัลใหม่ที่ชื่อ
dynamic_app_link_components
ซึ่งเป็นที่ที่คุณกำหนดค่ากฎแบบไดนามิก - กฎแบบไดนามิกอาจรวมตัวเทียบรูปแบบสำหรับเส้นทาง ส่วนย่อย และพารามิเตอร์การค้นหา
- นอกจากนี้ คุณยังทำเครื่องหมายตัวจับคู่รูปแบบใดก็ได้ว่ายกเว้น เพื่อให้ URL ที่ตรงกันไม่เปิดแอปของคุณ
- ตัวอย่างนี้แสดงตัวอย่างของตัวเทียบสำหรับเส้นทาง (
"/"
), Fragment ("#"
) และพารามิเตอร์การค้นหา ("?"
) รวมถึงตัวเทียบที่ยกเว้น ("exclude"
) - หากฟิลด์ใดในไฟล์มีรูปแบบไม่ถูกต้องหรือว่างเปล่า Android จะทิ้งกฎแบบไดนามิกและอุปกรณ์จะกลับไปใช้กฎที่กำหนดแบบคงที่ในไฟล์ Manifest ของแอป
กฎแบบไดนามิกจะระบุได้เฉพาะกฎที่มีผลภายในขอบเขตของโดเมน ที่คุณประกาศไว้ในไฟล์ Manifest ของแอป โปรดดูด้านล่าง
ประกาศกฎแบบไดนามิก
App Link แบบไดนามิกรองรับdynamic_app_link_components
relation
extension ใหม่ ซึ่งมีอาร์เรย์ของออบเจ็กต์กฎ แต่ละกฎจะกำหนดโดยใช้
ตัวเทียบรูปแบบสำหรับเส้นทาง ส่วนย่อย และพารามิเตอร์การค้นหาที่จะเปิด
แอปของคุณ นอกจากนี้ยังยกเว้นตัวเทียบแต่ละรายการได้ด้วยเพื่อไม่ให้เปิด
แอปของคุณ ทั้งนี้ทั้งหมดนี้เป็นตัวเลือก
- การจับคู่เส้นทาง
- คีย์: "/"
- ค่า: สตริงเดียว นิพจน์ที่ตรงกันสำหรับเส้นทาง 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}
]
กำหนดขอบเขตของกฎแบบไดนามิกอย่างเหมาะสม
เมื่อกำหนดกฎฝั่งเซิร์ฟเวอร์เพื่อใช้กับ Dynamic 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 อยู่แล้ว คุณสามารถเพิ่มการรองรับ Dynamic 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
ไฟล์แสดงโดยมี Content-Typeapplication/json
assetlinks.json
ต้องเข้าถึงได้ผ่านการเชื่อมต่อ HTTPS ไม่ว่าตัวกรอง Intent ของแอปจะประกาศ HTTPS เป็นรูปแบบข้อมูล หรือไม่ก็ตาม- ระบบต้องเข้าถึงไฟล์
assetlinks.json
ได้โดยไม่มีการเปลี่ยนเส้นทางใดๆ (ไม่มีการเปลี่ยนเส้นทาง 301 หรือ 302) - หากลิงก์แอปของคุณรองรับโดเมนโฮสต์หลายโดเมน คุณต้องเผยแพร่ไฟล์
assetlinks.json
ในแต่ละโดเมน ดูการรองรับการลิงก์แอปสำหรับ โฮสต์หลายราย - อย่าเผยแพร่แอปที่มี URL การทดสอบในไฟล์ Manifest ซึ่งอาจเข้าถึงไม่ได้สำหรับสาธารณะ (เช่น URL ที่เข้าถึงได้ด้วย VPN เท่านั้น) วิธีแก้ปัญหาในกรณีดังกล่าวคือกำหนดค่าตัวแปรของบิลด์เพื่อสร้าง ไฟล์ Manifest ที่แตกต่างกันสำหรับบิลด์สำหรับนักพัฒนาแอป
ดูคำแนะนำที่เกี่ยวข้องต่อไปนี้