App Link เป็นกลไกของ Android (Android 6.0+) ที่เปิดลิงก์เว็บในแอปที่ติดตั้งไว้โดยอัตโนมัติ โดยข้ามกล่องโต้ตอบการเลือก คำนี้ถูกนำเสนอโดย Google ในปี 2015 พร้อมกับ Android 6.0 Marshmallow ตาม Android Developers App Link ใช้ Digital Asset Links ซึ่งเป็นการยืนยันตัวตนแบบเข้ารหัสผ่านไฟล์บนเซิร์ฟเวอร์ เพื่อยืนยันว่าโดเมนเป็นของนักพัฒนาแอป
ประเด็นสำคัญ
App Link (Android App Link) คือลิงก์ HTTPS มาตรฐานที่เมื่อคลิกบนอุปกรณ์ Android จะเปิดแอปที่ติดตั้งไว้โดยอัตโนมัติโดยไม่แสดงกล่องโต้ตอบการเลือกมาตรฐานระหว่างเบราว์เซอร์และแอป Google เปิดตัว App Link ใน Android 6.0 (API 23) เพื่อเป็นวิธีแก้ปัญหากล่องโต้ตอบตัวเลือกที่ลดอัตราการแปลงของ deep link เนื่องจากการคลิกเพิ่มเติมและความสับสนของผู้ใช้
นวัตกรรมสำคัญ: การยืนยัน Android ยืนยันว่าโดเมนเป็นของนักพัฒนาแอปจริง ๆ ผ่าน Digital Asset Links API Google Play Store ตรวจสอบ App Link เมื่อเผยแพร่และสามารถปฏิเสธการอัปเดตหากการยืนยันล้มเหลว ทำให้ App Link ปลอดภัยกว่า Custom URL Scheme: ไม่มีแอปอื่นใดสามารถสกัดกั้นลิงก์ไปยังโดเมนของคุณได้
Digital Asset Links เป็นโปรโตคอลแบบเปิดที่ Google ใช้ไม่เพียง但对于 App Link แต่ยังสำหรับเชื่อมโยงเว็บไซต์กับแอปในผลการค้นหา Google Assistant และ Smart Lock for Passwords โปรโตคอลนี้ใช้การยืนยันตัวตนแบบเข้ารหัส: ใน assetlinks.json จะระบุลายเซ็น SHA256 ของใบรับรองการลงนามของแอป ซึ่งช่วยป้องกันการปลอมแปลง
กระบวนการทำงานของ App Link ประกอบด้วยสามขั้นตอน: การยืนยัน Digital Asset Links การประมวลผลผ่าน Intent Filter และการเปลี่ยนเส้นทางอัตโนมัติ แต่ละขั้นตอนเป็นสิ่งที่จำเป็น หากการยืนยันล้มเหลว Android จะแสดงกล่องโต้ตอบการเลือก — deep link ดังกล่าวทำงานปกติแต่ไม่มีข้อได้เปรียบของการเปลี่ยนผ่านอัตโนมัติ
Asset Links คือไฟล์ JSON ที่วางบนเซิร์ฟเวอร์ที่ https://domain/.well-known/assetlinks.json ไฟล์ประกอบด้วยอาร์เรย์ของออบเจกต์ที่มีฟิลด์: relation (อาร์เรย์ของสตริงที่อธิบายประเภทความสัมพันธ์), target (ออบเจกต์ที่มี namespace และ package_name ของแอป พร้อมด้วย sha256_cert_fingerprints — อาร์เรย์ของลายเซ็น SHA256 ของใบรับรองการลงนาม)
// assetlinks.json — การกำหนดค่า App Link ขั้นต่ำ
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": [
"14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:AD:A4:C5:AD:6B:01:14:79:6B:CB:12:6B:21:39:6F:EA"
]
}
}]
ลายเซ็น SHA256 ได้จากใบรับรองที่ใช้ในการลงนามแอป สำหรับบิลด์ดีบักจะใช้ใบรับรองดีบักมาตรฐานของ Android สำหรับบิลด์รีลีสจะใช้ใบรับรองจาก Google Play Console หรือของคุณเอง สำคัญ: เมื่อเปลี่ยนใบรับรองการลงนาม (เช่น เมื่อย้ายไปใช้ App Signing by Google Play) จำเป็นต้องอัปเดต assetlinks.json บนเซิร์ฟเวอร์ ไม่เช่นนั้น App Link จะหยุดทำงาน
Android ตรวจสอบ App Link เมื่อคลิกลิงก์ครั้งแรก ระบบดาวน์โหลด assetlinks.json จากเซิร์ฟเวอร์ เปรียบเทียบ package_name และลายเซ็น SHA256 กับใบรับรองของแอปที่ติดตั้งไว้ หากข้อมูลตรงกัน Android จะทำเครื่องหมาย Intent Filter ว่ายืนยันแล้ว และลิงก์ถัดไปทั้งหมดไปยังโดเมนนี้จะเปิดโดยอัตโนมัติโดยไม่ต้องมีกล่องโต้ตอบ
// AndroidManifest.xml — Intent Filter สำหรับ App Link
<activity
android:name=".ui.ProductActivity"
android:exported="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" />
<data
android:scheme="https"
android:host="example.com"
android:pathPrefix="/product" />
</intent-filter>
</activity>
autoVerify="true" เป็นแอตทริบิวต์ที่จำเป็นซึ่งสั่งให้ Android ตรวจสอบ assetlinks.json หากไม่มีแอตทริบิวต์นี้ Intent Filter จะไม่ได้รับการยืนยันและ App Link จะไม่เปิดใช้งาน Android รองรับหลาย Intent Filter ใน Activity เดียว — สำหรับโฮสต์ที่แตกต่างกัน ระบบจะตรวจสอบแต่ละโฮสต์แยกกัน การยืนยันจะดำเนินการแบบอะซิงโครนัสและอาจใช้เวลาถึง 20 วินาทีในการคลิกครั้งแรก
หลังจากการยืนยันสำเร็จ Android จะเปิดแอปโดยอัตโนมัติเมื่อคลิกลิงก์ใดก็ตามที่ตรงกับ Intent Filter ที่ยืนยันแล้ว ผู้ใช้ไม่เห็นกล่องโต้ตอบการเลือก — แอปเปิดทันที หากไม่ได้ติดตั้งแอป ลิงก์จะเปิดในเบราว์เซอร์ (เหมือนหน้าเว็บทั่วไป) นี่คือประสบการณ์ผู้ใช้ที่เหมาะ: การเปลี่ยนผ่านที่ราบรื่นโดยไม่ต้องดำเนินการที่ไม่จำเป็น
สำคัญ: การเปลี่ยนเส้นทางอัตโนมัติ ทำงานเฉพาะกับสคีมา https เท่านั้น App Link ไม่รองรับ http (โปรโตคอลที่ไม่ปลอดภัย) หากผู้ใช้เปิดลิงก์ http ด้วยตนเอง (เช่น จาก SMS) Android จะไม่ทำการยืนยันและแสดงกล่องโต้ตอบการเลือก ขอแนะนำให้ใช้ https สำหรับลิงก์ทั้งหมดที่นำไปยังแอปและกำหนดค่าการเปลี่ยนเส้นทาง HTTP ไปยัง HTTPS บนเซิร์ฟเวอร์
App Link คือวิวัฒนาการของ Deep Link บน Android ไม่ใช่การแทนที่ ความแตกต่างระหว่างทั้งสองนั้นเป็นพื้นฐาน Deep Link ปกติ (Custom URL Scheme) ทำงานผ่าน Intent Filter ด้วยสคีมาแบบกำหนดเอง (myapp://) และไม่มี autoVerify Android ไม่ตรวจสอบว่าแอปเชื่อมโยงกับสคีมานี้จริงหรือไม่ — แอปใด ๆ ก็สามารถลงทะเบียน myapp:// และสกัดกั้นลิงก์ได้
App Link แก้ปัญหาสามประการของ Deep Link ประการแรก: ความปลอดภัย — การยืนยันผ่าน Digital Asset Links ป้องกันการสกัดกั้นลิงก์ ประการที่สอง: ประสบการณ์ผู้ใช้ — การไม่มีกล่องโต้ตอบการเลือกเพิ่มอัตราการแปลงไปยังเป้าหมายได้ 20–40% ประการที่สาม: การจัดทำดัชนี — Google จัดทำดัชนี URL https ของ App Link และสามารถแสดงในผลการค้นหาเป็นลิงก์ไปยังเนื้อหาภายในแอป
ความเข้ากันได้: App Link ทำงานบน Android 6.0+ (99% ของอุปกรณ์) สำหรับ Android 5.x (Lollipop) จะใช้ Deep Link ปกติพร้อมกล่องโต้ตอบการเลือก ดังนั้นขอแนะนำให้รองรับทั้งสองกลไก: App Link สำหรับอุปกรณ์สมัยใหม่และ Custom URL Scheme เป็นตัวสำรองสำหรับรุ่นเก่า Intent Filter ที่มี autoVerify="true" ไม่ทำลายความเข้ากันได้ย้อนหลัง — บน Android < 6 แอตทริบิวต์จะถูกละเว้น
| คุณลักษณะ | Deep Link | App Link |
|---|---|---|
| สคีมา | กำหนดเอง (myapp://) | HTTPS (https://domain) |
| การยืนยัน | ไม่มี | assetlinks.json |
| กล่องโต้ตอบการเลือก | แสดง | การเปลี่ยนเส้นทางอัตโนมัติ |
| เวอร์ชัน Android | API 1+ | API 23+ (6.0+) |
| การจัดทำดัชนี Google | ไม่ | ใช่ (URL https) |
การตั้งค่า App Link ต้องการสามขั้นตอน: การกำหนดค่า Intent Filter ในแมนิเฟสต์ การวาง assetlinks.json บนเซิร์ฟเวอร์ และการตรวจสอบการยืนยัน ขั้นตอนแรกคือเพิ่ม Intent Filter ด้วย android:autoVerify="true" ใน AndroidManifest.xml สิ่งสำคัญคือต้องระบุสคีมา https โฮสต์ และเส้นทางที่แอปควรจัดการ เส้นทางสามารถมีไวลด์การ์ด (*) สำหรับโฟลเดอร์ย่อย
ขั้นตอนที่สอง คือการสร้าง assetlinks.json ไฟล์สามารถสร้างผ่าน Android Studio (Tools → App Links Assistant) ผู้ช่วยยังช่วยในการดีบักและทดสอบอีกด้วย ไฟล์ถูกวางบนเซิร์ฟเวอร์ที่ /.well-known/assetlinks.json เซิร์ฟเวอร์ต้องส่งคืน Content-Type: application/json และเข้าถึงได้ผ่าน HTTPS โดยไม่มีการเปลี่ยนเส้นทาง Google Play Console ยังแสดงสถานะการยืนยัน App Link ในส่วน Publishing
การทดสอบ — ขั้นตอนที่สาม ใช้ adb เพื่อตรวจสอบ: คำสั่ง adb shell am start -W -a android.intent.action.VIEW -d “https://example.com/product/42” เปิดแอป หากเปิดเบราว์เซอร์แทนแอป ให้ตรวจสอบ assetlinks.json และ autoVerify Android Studio App Links Assistant มีเครื่องมือทดสอบในตัว: มันแสดงสถานะการยืนยันสำหรับแต่ละโดเมนและเส้นทาง สำหรับการทดสอบอัตโนมัติ ให้ใช้ Android Testing Library กับ Intent Matcher
Android 12 (API 31) นำการเปลี่ยนแปลงในการจัดการ App Link เพิ่มการยืนยันเฉพาะโดเมนใหม่: ระบบตรวจสอบแต่ละลิงก์ทีละรายการ ไม่ใช่ทั้ง Intent Filter ซึ่งช่วยเพิ่มความปลอดภัย แต่ต้องอัปเดตไฟล์ assetlinks.json เมื่อเพิ่มเส้นทางใหม่ Android 12 ยังแนะนำ Android App Links Assistant ที่มาพร้อมกับ ADB — คำสั่งสำหรับจัดการการยืนยันผ่านเชลล์
หลายโดเมน เป็นสถานการณ์ทั่วไปสำหรับการผลิต แอปสามารถจัดการลิงก์จาก example.com, m.example.com และ example.org แต่ละโดเมนต้องมี assetlinks.json แยกต่างหากบนเซิร์ฟเวอร์ที่เกี่ยวข้อง ในแมนิเฟสต์จะเพิ่มหลาย Intent Filter — หนึ่งตัวต่อโดเมน ทั้งหมดต้องเข้าถึงได้ผ่าน HTTPS และผ่านการยืนยันอย่างอิสระ
App Link และ Jetpack Navigation เป็นวิธีที่แนะนำในการจัดการ App Link ในแอป Android สมัยใหม่ Jetpack Navigation รองรับ deep link แบบประกาศใน nav_graph.xml หรือผ่าน NavDeepLinkRequest ซึ่งช่วยลดความซับซ้อนของการนำทาง: นักพัฒนาอธิบายว่าหน้าจอใดเปิดสำหรับ URL ที่กำหนด และคอมโพเนนต์ Navigation จะจัดการ Intent และเรียกคืนสแต็กการนำทางเอง Google แนะนำให้ใช้ Jetpack Navigation สำหรับ App Link
// การประมวลผล App Link ผ่าน Jetpack Navigation
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
handleDeepLink(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleDeepLink(intent)
}
private fun handleDeepLink(intent: Intent) {
intent.data?.let { uri ->
navController.handleDeepLink(NavDeepLinkRequest
.Builder
.fromUri(uri)
.build()
)
}
}
}
Google Play Store ตรวจสอบ App Link เมื่อเผยแพร่ หากแมนิเฟสต์มี Intent Filter ที่มี autoVerify แต่ assetlinks.json ไม่พร้อมใช้งานหรือไม่ถูกต้อง Google Play อาจปฏิเสธการอัปเดตพร้อมคำเตือน ในคอนโซลนักพัฒนา (Policy and Programs → App Links) จะแสดงสถานะการยืนยันของแต่ละโดเมน ก่อนเผยแพร่ควรตรวจสอบสถานะเสมอ — การแก้ไขหลังจากการปฏิเสธการอัปเดตทำให้การปล่อยล่าช้า
คำถามที่พบบ่อย
App Link คือ Deep Link ที่มีการยืนยันผ่าน Digital Asset Links ความแตกต่างหลัก: App Link ใช้สคีมา https แทนสคีมาแบบกำหนดเอง ไม่แสดงกล่องโต้ตอบการเลือก และถูกจัดทำดัชนีโดย Google Deep Link ปกติทำงานบน Android ทุกเวอร์ชัน แต่ต้องเลือกแอปด้วยตนเอง
ไฟล์ วางที่รากของเซิร์ฟเวอร์ HTTPS ที่ /.well-known/assetlinks.json เซิร์ฟเวอร์ต้องส่งคืน Content-Type: application/json ควรอัปเดตไฟล์เมื่อเปลี่ยนใบรับรองการลงนามหรือเพิ่มโดเมนใหม่
สาเหตุหลัก: ไม่มี android:autoVerify="true" ใน Intent Filter, assetlinks.json ไม่พร้อมใช้งานผ่าน HTTPS, ลายเซ็น SHA256 ไม่ถูกต้อง, ใบรับรองการลงนามแตกต่างกัน (debug vs release) ตรวจสอบสถานะการยืนยันผ่าน adb shell dumpsync domain_verification
ไม่ได้ — App Link ต้องใช้เซิร์ฟเวอร์ HTTPS ที่มี assetlinks.json ที่เข้าถึงได้ หากคุณไม่มีโดเมน ให้ใช้ Firebase Hosting หรือ GitHub Pages เพื่อโฮสต์ไฟล์ ทางเลือก: Custom URL Scheme (ไม่มีการยืนยัน) หรือ Firebase Dynamic Links
ไม่ได้ — App Link รองรับบน Android 6.0 (API 23) ขึ้นไป บน Android 5 Intent Filter ที่มี android:autoVerify="true" จะละเว้นแอตทริบิวต์และทำงานเป็น Deep Link ปกติพร้อมกล่องโต้ตอบการเลือก ขอแนะนำให้รองรับทั้งสองกลไกเพื่อความเข้ากันได้ย้อนหลัง
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม