Universal Link เป็นกลไกของ Apple (iOS 9+) ที่ช่วยให้เปิดลิงก์เว็บได้โดยตรงในแอป โดยไม่ผ่าน Safari หากไม่ได้ติดตั้งแอป ลิงก์จะเปิดในเบราว์เซอร์อย่างราบรื่น คำศัพท์นี้ถูกนำเสนอโดย Apple ในปี 2015 ที่ WWDC ซึ่งเป็นส่วนหนึ่งของ Handoff และระบบนิเวศ Continuity ตาม Apple Developer Universal Link มอบประสบการณ์ผู้ใช้ที่เป็นหนึ่งเดียวระหว่างเว็บและแอปพลิเคชันพื้นเมืองโดยไม่มีกล่องโต้ตอบให้เลือก
ประเด็นสำคัญ
Universal Link คือลิงก์ HTTPS มาตรฐาน เช่น https://example.com/page ซึ่งเมื่อแตะบนอุปกรณ์ iOS จะเปิดแอปที่ติดตั้งไว้แทน Safari ความแตกต่างหลักจาก Custom URL Scheme: Universal Link ไม่จำเป็นต้องลงทะเบียนสคีมาที่กำหนดเอง (myapp://) — มันใช้โดเมนปกติ สิ่งนี้ช่วยขจัดปัญหา URL Scheme hijacking ที่แอปใด ๆ สามารถลงทะเบียนสคีมาเดียวกันได้
Apple เปิดตัว Universal Link ในงาน WWDC 2015 ซึ่งเป็นส่วนหนึ่งของ iOS 9 กลไกนี้กลายเป็นส่วนหนึ่งของระบบนิเวศ Handoff และ Spotlight: Universal Link ทำงานไม่เพียงแต่ในเบราว์เซอร์ แต่ยังรวมถึงในผลการค้นหา Spotlight, Mail, Messages และแอประบบอื่น ๆ นอกจากนี้ Universal Link ยังรองรับบน watchOS และ macOS — ผู้ใช้สามารถเปิดแอปบน iPhone ผ่านลิงก์บน Mac
ข้อได้เปรียบหลัก: URL เดียว นักพัฒนาไม่ต้องจัดการลิงก์สองแบบที่แตกต่างกัน (หนึ่งสำหรับเว็บ อีกหนึ่งสำหรับแอป) Universal Link คือลิงก์ https เดียวกัน หากติดตั้งแอป — แอปจะเปิด หากไม่ได้ติดตั้ง — ลิงก์เดียวกันจะเปิดใน Safari เป็นหน้าเว็บปกติ สิ่งนี้ให้ fallback ที่เหมาะโดยไม่สูญเสียทราฟฟิก
กลไก Universal Link ประกอบด้วยสามขั้นตอน: การตรวจสอบการเชื่อมโยง การจัดการลิงก์ และ fallback ไปยังเบราว์เซอร์ แต่ละขั้นตอนมีความสำคัญต่อการทำงานที่ถูกต้อง หากไม่ได้กำหนดค่าการเชื่อมโยง iOS จะจัดการลิงก์เป็นการเปลี่ยนเส้นทางปกติไปยัง Safari มาดูแต่ละขั้นตอนโดยละเอียด
เมื่อแตะลิงก์ครั้งแรก iOS จะดาวน์โหลดไฟล์ apple-app-site-association จากเซิร์ฟเวอร์ที่ https://example.com/.well-known/apple-app-site-association ไฟล์ประกอบด้วย JSON ที่มี Team ID และ Bundle ID ของแอป พร้อมรายการพาธที่แอปควรเปิด iOS จัดเก็บไฟล์นี้ในแคชและตรวจสอบความสดใหม่เป็นระยะ (เมื่ออัปเดตแอป รีสตาร์ทอุปกรณ์)
ไฟล์ JSON apple-app-site-association ต้องเข้าถึงได้ผ่าน HTTPS โดยไม่มีการเปลี่ยนเส้นทาง เซิร์ฟเวอร์ต้องส่งคืน Content-Type: application/json สิ่งสำคัญคือไฟล์ไม่มีนามสกุล .json — iOS ค้นหาอย่างเคร่งครัดที่ /.well-known/apple-app-site-association Apple แนะนำให้เพิ่มการรองรับ Universal Link ใน CDN และตรวจสอบว่าไฟล์ไม่ได้ถูกบล็อกโดย robots.txt
// apple-app-site-association — การกำหนดค่าขั้นต่ำ
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": ["/product/*", "/profile/*", "/search"]
}
]
}
}
appID ถูกสร้างเป็น Team ID + Bundle ID (TEAMID.com.example.app) paths คืออาร์เรย์ของรูปแบบ URL ที่แอปควรจัดการ สามารถใช้ *, ? และสัญกรณ์ NOT: ["NOT /admin/*", "/product/*"] พาธจะถูกตรวจสอบตามลำดับ: การตรงกันครั้งแรกกำหนดพฤติกรรม หากพาธไม่ตรงกัน — ลิงก์จะเปิดใน Safari
หลังจากการตรวจสอบการเชื่อมโยงสำเร็จ iOS จะส่งลิงก์ไปยังแอป การจัดการจะดำเนินการใน AppDelegate ผ่านเมธอด application(_:continue:restorationHandler:) สำหรับ NSUserActivity หรือใน SceneDelegate ผ่าน scene(_:continue:) นักพัฒนาได้รับออบเจกต์ NSUserActivity ชนิด NSUserActivityTypeBrowsingWeb แยก URL และนำทางไปยังหน้าจอที่เกี่ยวข้อง
// การจัดการ Universal Link ใน AppDelegate
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping UIUserActivityRestorationHandler
) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL
else { return false }
// นำทางไปยังหน้าจอตาม URL
DeepLinkRouter.navigate(to: url)
return true
}
DeepLinkRouter ในตัวอย่างด้านบนเป็นคลาสที่กำหนดเองที่แยกวิเคราะห์ URL และเรียกผู้ประสานงานการนำทางที่เกี่ยวข้อง สำหรับ SwiftUI การจัดการจะดำเนินการผ่านเมธอด onOpenURL หรือตัวปรับแต่ง environment(\.openURL) สิ่งสำคัญคือต้องจัดการไม่เพียงแต่การเริ่มต้นในพื้นหน้า แต่ยังรวมถึงกรณีที่แอปไม่ได้ทำงาน (cold start): Universal Link จะเปิดแอปผ่านตัวเลือกการเริ่มต้นในกรณีนี้
หากไม่ได้ติดตั้งแอป iOS จะเปิด Universal Link ใน Safari โดยอัตโนมัติ นี่คือความแตกต่างสำคัญจาก Custom URL Scheme: ผู้ใช้ไม่เห็นข้อผิดพลาด Fallback คือหน้าเว็บมาตรฐานของโดเมนเดียวกัน นักพัฒนาสามารถวางลิงก์ App Store ข้อมูลผลิตภัณฑ์ หรือเนื้อหาทางเลือกบนหน้านี้
สำคัญ: fallback ไม่สามารถปรับแต่ง ในระดับ iOS ได้ iOS เพียงเปิด URL ใน Safari เพื่อแสดงเนื้อหาที่แตกต่างสำหรับผู้ใช้ที่มีและไม่มีแอปติดตั้ง ให้ใช้ Smart App Banner (เมตาแท็กสำหรับ Safari ที่เสนอให้เปิดแอป) หรือการตรวจจับการติดตั้งด้วย JavaScript Apple ยังมี SKAdNetwork สำหรับการระบุแหล่งที่มาของการติดตั้งผ่าน Universal Link
Universal Link และ Deep Link แบบดั้งเดิม (Custom URL Scheme) แก้ปัญหาเดียวกัน แต่แตกต่างกันโดยพื้นฐานในสถาปัตยกรรมและความปลอดภัย Custom URL Scheme คือโปรโตคอลที่กำหนดเอง (myapp://) ที่ลงทะเบียนใน Info.plist แอปใด ๆ ก็สามารถลงทะเบียนสคีมาเดียวกัน (myapp://) และ iOS ไม่สามารถระบุได้ว่าอันไหนเป็น “ของจริง” สิ่งนี้เรียกว่า URL Scheme hijacking
Universal Link แก้ปัญหา hijacking ผ่านการตรวจสอบโดเมน เฉพาะเจ้าของโดเมนเท่านั้นที่สามารถวาง apple-app-site-association บนเซิร์ฟเวอร์ของตน ยืนยันการเชื่อมต่อกับ Bundle ID ที่เฉพาะเจาะจง แอปสองแอปไม่สามารถลงทะเบียน Universal Link เดียวกันได้: หากเกิดข้อขัดแย้ง iOS จะให้ความสำคัญกับแอปที่ติดตั้งล่าสุดหรือเปิด Safari
ความแตกต่างอีกประการ: Fallback Custom URL Scheme ไม่มี fallback — หากไม่ได้ติดตั้งแอป เบราว์เซอร์จะแสดงข้อผิดพลาด Universal Link จะเปิดเว็บไซต์ URL เดียวหมายความว่าค่า SEO ของลิงก์ยังคงอยู่ (Google จัดทำดัชนีลิงก์) และผู้ใช้ที่มีอุปกรณ์ใด ๆ ก็ได้รับเนื้อหาที่เกี่ยวข้อง Universal Link เป็นขั้นตอนวิวัฒนาการจาก deep link ไปยัง unified link
| คุณลักษณะ | Custom URL Scheme | Universal Link |
|---|---|---|
| รูปแบบ | myapp://path | https://domain/path |
| การตรวจสอบ | ไม่มี | apple-app-site-association |
| ความปลอดภัย | เสี่ยงต่อการ hijacking | เฉพาะเจ้าของโดเมน |
| Fallback | ข้อผิดพลาด | เว็บไซต์ใน Safari |
| เวอร์ชัน iOS | iOS 3+ | iOS 9+ |
การตั้งค่า Universal Link ประกอบด้วยส่วนเซิร์ฟเวอร์และส่วนไคลเอ็นต์ ส่วนเซิร์ฟเวอร์ — วางไฟล์ apple-app-site-association ที่ https://domain/.well-known/apple-app-site-association ส่วนไคลเอ็นต์ — ลงทะเบียนโดเมนใน Associated Domains ใน Xcode (Capabilities → Associated Domains → applinks:example.com) หลังจากนั้น แอปจะได้รับ Universal Links ทั้งหมดสำหรับโดเมนที่ระบุโดยอัตโนมัติ
ขั้นตอนการตั้งค่า:
การดีบัก Universal Link เป็นปัญหาทั่วไปสำหรับนักพัฒนา iOS สาเหตุหลักของลิงก์ที่ใช้งานไม่ได้: ไฟล์ apple-app-site-association ไม่สามารถเข้าถึงได้ผ่าน HTTPS, appID ไม่ถูกต้อง, Content-Type ไม่ใช่ application/json, การเปลี่ยนเส้นทางจากพาธ /.well-known, การแคชเวอร์ชันเก่า (รีเซ็ตผ่าน Settings → Developer → Associated Domains Development) Apple มีเครื่องมือ Validation Checker ใน Apple Developer Console สำหรับทดสอบการเชื่อมโยง
Branch และแพลตฟอร์ม MMP อื่น ๆ ทำให้การตั้งค่า Universal Link ง่ายขึ้น: พวกเขาสร้าง apple-app-site-association โดยอัตโนมัติและโฮสต์บนโดเมนของตนเอง นักพัฒนาเพียงเพิ่มโดเมน Branch ใน Associated Domains และรวม SDK ซึ่งสะดวกเป็นพิเศษสำหรับสตาร์ทอัพที่ไม่มีโครงสร้างพื้นฐานเซิร์ฟเวอร์ของตนเองในการโฮสต์ไฟล์ AASA
Universal Link มีข้อจำกัดหลายประการ หนึ่ง: ไฟล์ apple-app-site-association ต้องเข้าถึงได้ผ่าน HTTPS เท่านั้น (HTTP ไม่รองรับ) สอง: ลิงก์ต้องชี้ไปยังโดเมนเดียวกับที่ระบุใน Associated Domains Universal Links ข้ามโดเมนใช้ไม่ได้ — แต่ละโดเมนต้องมีรายการแยกต่างหากใน Capabilities และไฟล์ AASA แยกต่างหาก สาม: Universal Link ไม่ทำงานใน WKWebView — ทำงานเฉพาะใน Safari และส่วนประกอบระบบ
ความเข้ากันได้: iOS 9.0+ (Universal Link), watchOS 6.0+ (Handoff Universal Link), macOS 10.15+ (Catalyst และแอป Mac) ในเวอร์ชัน iOS ที่เก่ากว่า ลิงก์จะเปิดใน Safari ซึ่งหมายความว่าบน iOS 8 (น้อยกว่า 1% ของอุปกรณ์) Universal Link จะไม่ทำงาน แนะนำให้รองรับ Custom URL Scheme เป็น fallback สำหรับอุปกรณ์เก่าหากกลุ่มเป้าหมายของคุณรวมถึงผู้ใช้ที่มีเวอร์ชันเก่า
การเปลี่ยนแปลง iOS 16+: Apple ปรับปรุงการจัดการ Universal Link สำหรับ SwiftUI ตัวปรับแต่ง environment(\.openURL) ใหม่ที่มีความสามารถในการประมวลผลแบบรอการดำเนินการถูกนำมาใช้ iOS 16 ยังอนุญาตให้เปิด Universal Links ในแอปผ่าน SFSafariViewController สำหรับผู้ใช้ iOS 16 แนะนำให้เปลี่ยนไปใช้การจัดการ Universal Link ด้วย SwiftUI โดยสมบูรณ์ โดยเก็บโค้ด AppDelegate ไว้เฉพาะสำหรับความเข้ากันได้ย้อนหลัง
คำถามที่พบบ่อย
Universal Link ใช้ URL HTTPS มาตรฐานและตรวจสอบผ่านไฟล์บนเซิร์ฟเวอร์ Custom URL Scheme ใช้โปรโตคอลที่กำหนดเอง (myapp://) โดยไม่มีการตรวจสอบ ทำให้เสี่ยงต่อการสกัดกั้นโดยแอปอื่นที่ลงทะเบียนสคีมาเดียวกัน
ไฟล์ วางในรูทของเซิร์ฟเวอร์ HTTPS ที่ /.well-known/apple-app-site-association (ไม่มีนามสกุล .json) เซิร์ฟเวอร์ต้องส่งคืน Content-Type: application/json สำคัญ: ไม่มีการเปลี่ยนเส้นทาง ไฟล์ต้องเข้าถึงได้โดยตรง
สาเหตุหลัก: Team ID หรือ Bundle ID ไม่ถูกต้องในไฟล์ AASA, ไฟล์ไม่สามารถเข้าถึงได้ผ่าน HTTPS, การเปลี่ยนเส้นทาง, Content-Type ไม่ถูกต้อง, การแคชเวอร์ชันเก่า ตรวจสอบผ่าน Developer → Associated Domains Development และรีสตาร์ทอุปกรณ์เพื่อล้างแคช
ไม่ได้ — Universal Link ต้องใช้เซิร์ฟเวอร์ HTTPS ที่โฮสต์ apple-app-site-association หากไม่มีโดเมน Universal Link จะไม่ทำงาน ทางเลือก: Custom URL Scheme (ปลอดภัยน้อยกว่า) หรือบริการของบุคคลที่สาม (Branch, Firebase) ที่มีโดเมนของตนเอง
ไม่ได้ — Universal Link เป็นเทคโนโลยีเฉพาะของ Apple สำหรับ iOS, iPadOS, watchOS และ macOS บน Android สิ่งที่เทียบเท่าเรียกว่า App Link (Android 6.0+) ซึ่งใช้ Digital Asset Links (assetlinks.json) แทน apple-app-site-association
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม