Universal Link là cơ chế của Apple (iOS 9+) cho phép mở liên kết web trực tiếp trong ứng dụng, bỏ qua Safari. Nếu ứng dụng chưa được cài đặt, liên kết sẽ mở liền mạch trong trình duyệt. Thuật ngữ này được Apple giới thiệu vào năm 2015 tại WWDC như một phần của Handoff và hệ sinh thái Continuity. Theo Apple Developer, Universal Link cung cấp trải nghiệm người dùng thống nhất giữa web và ứng dụng gốc mà không có hộp thoại lựa chọn.
Những điểm chính
Universal Link là một liên kết HTTPS tiêu chuẩn như https://example.com/page, khi chạm trên thiết bị iOS sẽ mở ứng dụng đã cài đặt thay vì Safari. Sự khác biệt chính so với Custom URL Scheme: Universal Link không yêu cầu đăng ký lược đồ tùy chỉnh (myapp://) — nó sử dụng tên miền thông thường. Điều này loại bỏ vấn đề URL Scheme hijacking, khi bất kỳ ứng dụng nào cũng có thể đăng ký cùng một lược đồ.
Apple đã giới thiệu Universal Link tại WWDC 2015 như một phần của iOS 9. Cơ chế này trở thành một phần của hệ sinh thái Handoff và Spotlight: Universal Link hoạt động không chỉ trong trình duyệt mà còn trong kết quả tìm kiếm Spotlight, Mail, Messages và các ứng dụng hệ thống khác. Ngoài ra, Universal Link được hỗ trợ trên watchOS và macOS — người dùng có thể mở ứng dụng trên iPhone qua liên kết trên Mac.
Lợi thế chính: URL thống nhất. Nhà phát triển không phải quản lý hai liên kết khác nhau (một cho web, một cho ứng dụng). Universal Link là cùng một liên kết https. Nếu ứng dụng được cài đặt — nó sẽ mở ứng dụng. Nếu không — cùng một liên kết mở trong Safari như một trang web thông thường. Điều này cung cấp dự phòng lý tưởng mà không mất lưu lượng truy cập.
Cơ chế Universal Link bao gồm ba giai đoạn: xác minh liên kết, xử lý liên kết và dự phòng trình duyệt. Mỗi giai đoạn đều quan trọng cho hoạt động chính xác. Nếu liên kết không được cấu hình, iOS xử lý liên kết như chuyển hướng thông thường đến Safari. Hãy xem xét từng giai đoạn chi tiết.
Khi chạm lần đầu vào liên kết, iOS tải tệp apple-app-site-association từ máy chủ tại https://example.com/.well-known/apple-app-site-association. Tệp chứa JSON với Team ID và Bundle ID của ứng dụng, cùng danh sách các đường dẫn mà ứng dụng nên mở. iOS lưu tệp này vào bộ nhớ đệm và định kỳ kiểm tra tính mới (khi cập nhật ứng dụng, khởi động lại thiết bị).
Tệp JSON apple-app-site-association phải có thể truy cập qua HTTPS mà không có chuyển hướng. Máy chủ phải trả về Content-Type: application/json. Quan trọng: tệp không có phần mở rộng .json — iOS tìm kiếm nó chính xác tại /.well-known/apple-app-site-association. Apple cũng khuyến nghị thêm hỗ trợ Universal Link trong CDN và kiểm tra rằng tệp không bị chặn bởi robots.txt.
// apple-app-site-association — cấu hình tối thiểu
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.com.example.app",
"paths": ["/product/*", "/profile/*", "/search"]
}
]
}
}
appID được hình thành là Team ID + Bundle ID (TEAMID.com.example.app). paths là một mảng các mẫu URL mà ứng dụng sẽ xử lý. Có thể sử dụng *, ? và ký hiệu NOT: ["NOT /admin/*", "/product/*"]. Các đường dẫn được kiểm tra theo thứ tự liệt kê: kết quả khớp đầu tiên xác định hành vi. Nếu đường dẫn không khớp — liên kết mở trong Safari.
Sau khi xác minh liên kết thành công, iOS chuyển liên kết đến ứng dụng. Xử lý được thực hiện trong AppDelegate qua phương thức application(_:continue:restorationHandler:) cho NSUserActivity, hoặc trong SceneDelegate qua scene(_:continue:). Nhà phát triển nhận được đối tượng NSUserActivity với loại NSUserActivityTypeBrowsingWeb, trích xuất URL và điều hướng đến màn hình tương ứng.
// Xử lý Universal Link trong AppDelegate
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping UIUserActivityRestorationHandler
) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL
else { return false }
// Điều hướng đến màn hình theo URL
DeepLinkRouter.navigate(to: url)
return true
}
DeepLinkRouter trong ví dụ trên là một lớp tùy chỉnh phân tích URL và gọi điều phối viên điều hướng tương ứng. Đối với SwiftUI, xử lý được thực hiện qua phương thức onOpenURL hoặc bộ sửa đổi environment(\.openURL). Điều quan trọng là xử lý không chỉ khởi động tiền cảnh mà còn trường hợp ứng dụng chưa chạy (khởi động nguội): Universal Link mở ứng dụng qua các tùy chọn khởi động trong trường hợp này.
Nếu ứng dụng không được cài đặt, iOS tự động mở Universal Link trong Safari. Đây là sự khác biệt chính so với Custom URL Scheme: người dùng không thấy lỗi. Dự phòng là trang web tiêu chuẩn của cùng tên miền. Nhà phát triển có thể đặt liên kết App Store, thông tin sản phẩm hoặc nội dung thay thế trên trang này.
Quan trọng: dự phòng không thể tùy chỉnh ở cấp iOS. iOS chỉ đơn giản mở URL trong Safari. Để hiển thị nội dung khác nhau cho người dùng có và không có ứng dụng đã cài đặt, hãy sử dụng Smart App Banner (thẻ meta cho Safari đề nghị mở ứng dụng) hoặc phát hiện cài đặt bằng JavaScript. Apple cũng cung cấp SKAdNetwork để quy kết cài đặt qua Universal Link.
Universal Link và Deep Link truyền thống (Custom URL Scheme) giải quyết cùng một vấn đề nhưng khác nhau cơ bản về kiến trúc và bảo mật. Custom URL Scheme là một giao thức tùy chỉnh (myapp://) được đăng ký trong Info.plist. Bất kỳ ứng dụng nào cũng có thể đăng ký cùng lược đồ (myapp://), và iOS không thể xác định cái nào là “thật”. Điều này được gọi là URL Scheme hijacking.
Universal Link giải quyết vấn đề hijacking thông qua xác minh tên miền. Chỉ chủ sở hữu tên miền mới có thể đặt apple-app-site-association trên máy chủ của họ, xác nhận kết nối với một Bundle ID cụ thể. Hai ứng dụng không thể đăng ký cùng một Universal Link: nếu xảy ra xung đột, iOS ưu tiên ứng dụng được cài đặt sau cùng hoặc mở Safari.
Một sự khác biệt khác: Dự phòng. Custom URL Scheme không có dự phòng — nếu ứng dụng không được cài đặt, trình duyệt hiển thị lỗi. Universal Link mở trang web. URL thống nhất có nghĩa là giá trị SEO của liên kết được bảo tồn (Google lập chỉ mục liên kết) và người dùng với bất kỳ thiết bị nào cũng nhận được nội dung phù hợp. Universal Link là bước tiến hóa từ deep link đến liên kết thống nhất.
| Đặc điểm | Custom URL Scheme | Universal Link |
|---|---|---|
| Định dạng | myapp://path | https://domain/path |
| Xác minh | Không | apple-app-site-association |
| Bảo mật | Dễ bị hijacking | Chỉ chủ sở hữu miền |
| Dự phòng | Lỗi | Trang web trong Safari |
| Phiên bản iOS | iOS 3+ | iOS 9+ |
Thiết lập Universal Link bao gồm phần máy chủ và phần máy khách. Phần máy chủ — đặt tệp apple-app-site-association tại https://domain/.well-known/apple-app-site-association. Phần máy khách — đăng ký tên miền trong Associated Domains trong Xcode (Capabilities → Associated Domains → applinks:example.com). Sau đó, ứng dụng tự động nhận tất cả Universal Links cho tên miền đã chỉ định.
Các bước thiết lập:
Gỡ lỗi Universal Link là vấn đề phổ biến với nhà phát triển iOS. Nguyên nhân chính của liên kết không hoạt động: tệp apple-app-site-association không truy cập được qua HTTPS, appID sai, Content-Type không phải application/json, chuyển hướng từ đường dẫn /.well-known, lưu cache phiên bản cũ (đặt lại qua Settings → Developer → Associated Domains Development). Apple cung cấp công cụ Validation Checker trong Apple Developer Console để kiểm tra liên kết.
Branch và các nền tảng MMP khác đơn giản hóa việc thiết lập Universal Link: họ tự động tạo apple-app-site-association và lưu trữ trên tên miền riêng của họ. Nhà phát triển chỉ cần thêm tên miền Branch vào Associated Domains và tích hợp SDK. Điều này đặc biệt thuận tiện cho các startup không có cơ sở hạ tầng máy chủ riêng để lưu trữ tệp AASA.
Universal Link có một số hạn chế. Thứ nhất: tệp apple-app-site-association phải truy cập được chính xác qua HTTPS (HTTP không được hỗ trợ). Thứ hai: liên kết phải trỏ đến cùng tên miền được chỉ định trong Associated Domains. Universal Links liên miền không hoạt động — mỗi tên miền yêu cầu một mục riêng trong Capabilities và một tệp AASA riêng. Thứ ba: Universal Link không hoạt động trong WKWebView — chỉ trong Safari và các thành phần hệ thống.
Tương thích: iOS 9.0+ (Universal Link), watchOS 6.0+ (Handoff Universal Link), macOS 10.15+ (Catalyst và ứng dụng Mac). Trên các phiên bản iOS cũ hơn, liên kết mở trong Safari. Điều này có nghĩa là trên iOS 8 (dưới 1% thiết bị) Universal Link sẽ không hoạt động. Nên hỗ trợ thêm Custom URL Scheme như dự phòng cho thiết bị cũ nếu đối tượng của bạn bao gồm người dùng với phiên bản lỗi thời.
Thay đổi iOS 16+: Apple đã cải thiện xử lý Universal Link cho SwiftUI. Một bộ sửa đổi mới environment(\.openURL) với khả năng xử lý trễ đã được giới thiệu. iOS 16 cũng cho phép mở Universal Links trong ứng dụng ngay cả qua SFSafariViewController. Đối với người dùng iOS 16, nên chuyển hoàn toàn sang xử lý Universal Link bằng SwiftUI, chỉ giữ mã AppDelegate để tương thích ngược.
Câu hỏi thường gặp
Universal Link sử dụng URL HTTPS tiêu chuẩn và được xác minh qua tệp trên máy chủ. Custom URL Scheme sử dụng giao thức tùy chỉnh (myapp://) không có xác minh, khiến nó dễ bị chặn bởi ứng dụng khác đã đăng ký cùng lược đồ.
Tệp được đặt tại thư mục gốc của máy chủ HTTPS tại /.well-known/apple-app-site-association (không có phần mở rộng .json). Máy chủ phải trả về Content-Type: application/json. Quan trọng: không chuyển hướng, tệp phải truy cập trực tiếp được.
Nguyên nhân chính: Team ID hoặc Bundle ID sai trong tệp AASA, tệp không truy cập được qua HTTPS, chuyển hướng, Content-Type sai, cache phiên bản cũ. Kiểm tra qua Developer → Associated Domains Development và khởi động lại thiết bị để xóa cache.
Không — Universal Link yêu cầu máy chủ HTTPS lưu trữ apple-app-site-association. Không có tên miền, Universal Link không hoạt động. Thay thế: Custom URL Scheme (kém an toàn hơn) hoặc dịch vụ bên thứ ba (Branch, Firebase) với tên miền riêng.
Không — Universal Link là công nghệ độc quyền của Apple cho iOS, iPadOS, watchOS và macOS. Trên Android, tương đương được gọi là App Link (Android 6.0+), sử dụng Digital Asset Links (assetlinks.json) thay vì apple-app-site-association.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm