Bỏ qua tới nội dung
CÔNG NGHỆGIẢI THÍCH

Vì sao có link mở thẳng app, có link lại bật ra trang web?

Cùng là bấm link, có lúc vào thẳng app, có lúc lại mở trình duyệt. Giải thích cơ chế Universal Links, App Links, 6 lý do link mở ra web và cách bật lại chế độ mở app trên iPhone, Android.

BBeernary29/10/2026 · 12 PHÚT ĐỌC
COVER.BMP
Vì sao có link mở thẳng app, có link lại bật ra trang web?
▲ Cơ chế quyết định một đường link mở vào ứng dụng hay mở ra trình duyệt

Cùng là bấm vào một đường link, có link mở thẳng ứng dụng mua sắm, có link lại bật ra trang web trong trình duyệt, bắt bạn đăng nhập lại từ đầu. Nhiều người nghĩ điện thoại "dở chứng", nhưng thực ra mọi thứ đều có quy tắc. Đằng sau mỗi lần link mở được app là một cuộc bắt tay giữa ứng dụng, website và hệ điều hành, và chỉ cần một bên lệch nhịp, bạn sẽ bị đẩy ra web.

Bài này giải thích cơ chế đó từ gốc: link mở app hoạt động thế nào, vì sao nó hay "trượt", bạn có thể tự bật lại ra sao, và nhà phát triển cần kiểm tra những gì.

Ở thời kỳ đầu của smartphone, cách duy nhất để một link mở được app là custom URL scheme: app tự đặt cho mình một "tiền tố" riêng, kiểu shopapp://product/123. Bạn đã gặp các scheme quen thuộc như tel: (gọi điện) hay mailto: (soạn email), custom scheme cũng y như vậy nhưng do từng app tự đăng ký.

Cách này đơn giản nhưng có ba điểm yếu chết người:

  • Máy chưa cài app thì link chết đứng. Trình duyệt không biết shopapp:// là gì nên báo lỗi "địa chỉ không hợp lệ", người dùng không được dẫn đi đâu cả.
  • Không ai giữ bản quyền cái tên. Bất kỳ app nào cũng có thể đăng ký cùng scheme. Khi hai app tranh nhau, hệ điều hành không có cách nào biết đâu là app chính chủ, và đây từng là kẽ hở để app giả mạo "nghe lén" link đăng nhập.
  • Không chia sẻ được ra ngoài. Link shopapp:// dán lên mạng xã hội, gửi qua email thường không bấm được, máy tính cũng không mở được.

Ngón tay chạm vào ứng dụng trên màn hình điện thoại Samsung

Vì vậy, năm 2015, cả hai nền tảng lớn cùng đưa ra lời giải: Apple giới thiệu Universal Links từ iOS 9, Google giới thiệu Android App Links từ Android 6.0. Ý tưởng chung rất gọn: dùng luôn link web bình thường bắt đầu bằng https://. Có app thì mở app, chưa có app thì mở web. Một link duy nhất chạy được ở mọi nơi.

Với link https://shop.vn/sp/123, điện thoại phải trả lời một câu hỏi trước khi mở: "có app nào được phép nhận link của tên miền shop.vn không?". Nếu có, link mở thẳng vào màn hình sản phẩm trong app. Nếu không, link mở trong trình duyệt như mọi trang web khác.

Điểm mấu chốt: hệ điều hành không tin lời app một cách mù quáng. Nếu chỉ cần app tự nhận "tôi là chủ shop.vn" là đủ, thì kẽ hở giành tên của custom scheme sẽ quay lại. Thay vào đó, quyền mở link phải được cả hai phía xác nhận: app nói "tôi muốn nhận link của tên miền này", và chính tên miền đó phải nói "đúng, tôi cho phép app này".

Màn hình khoá, widget và màn hình chính của iPhone với nhiều ứng dụng

Deep link là gì?

"Deep link" là tên gọi chung cho mọi link đưa người dùng vào thẳng một màn hình cụ thể bên trong app (trang sản phẩm, bài viết, đơn hàng) thay vì chỉ mở màn hình chính. Custom scheme, Universal Links và App Links đều là các cách làm deep link.

Cái bắt tay bí mật: app khai báo, website xác nhận

Phía app: khai báo trước trong file cài đặt

Lập trình viên ghi sẵn danh sách tên miền mà app muốn nhận ngay trong gói cài đặt:

  • iPhone: khai báo trong mục Associated Domains, mỗi dòng dạng applinks:shop.vn.
  • Android: khai báo trong file AndroidManifest.xml một intent-filter gồm scheme https, host shop.vn và thuộc tính android:autoVerify="true" (yêu cầu hệ thống tự xác minh).

Vì nằm trong file cài đặt đã được ký, lời khai này không thể bị sửa sau khi phát hành, muốn đổi phải ra bản cập nhật mới.

Phía website: đặt một file xác nhận ở đúng chỗ

Tên miền phải đặt một file JSON trong thư mục /.well-known/:

iPhone (Universal Links) Android (App Links)
Tên file apple-app-site-association (không có đuôi .json) assetlinks.json
Đường dẫn https://shop.vn/.well-known/apple-app-site-association https://shop.vn/.well-known/assetlinks.json
Định danh app Team ID + Bundle ID Tên gói (package name) + vân tay SHA-256 của chứng chỉ ký app
Chọn đường dẫn Có thể chỉ định đường dẫn nào mở app, đường dẫn nào ở lại web Xác minh theo cả tên miền, lọc đường dẫn ở phía manifest
Ai tải file Từ iOS 14, máy tải qua CDN của Apple, không gọi thẳng website Máy tự tải trực tiếp từ website

Tủ máy chủ trong trung tâm dữ liệu, nơi website trả về file xác nhận

Lúc nào thì đối chiếu?

Việc xác minh diễn ra khi bạn cài hoặc cập nhật app, không phải mỗi lần bấm link. Điện thoại lấy danh sách tên miền app khai báo, tải file xác nhận của từng tên miền về, rồi so khớp. Hai bên khớp nhau thì tên miền được đánh dấu "đã xác minh", từ đó link của tên miền ấy mở thẳng vào app.

Sai một dòng là mãi mở ra web

File trả về lỗi 404, bị chuyển hướng (redirect), sai định dạng JSON, sai Team ID, hay vân tay chứng chỉ không khớp (rất hay gặp khi app được Google Play ký lại bằng khoá khác khoá của lập trình viên) đều làm xác minh thất bại. Và vì máy chỉ kiểm tra lúc cài, lỗi này không tự hết cho tới khi app được cài lại hoặc hệ thống kiểm tra lại.

Giả sử app đã khai báo đúng và website đã xác nhận đúng, link vẫn có thể mở ra web. Đây là những tình huống hay gặp nhất.

1. Cái bắt tay bị hỏng

Đã nói ở trên: file xác nhận lỗi hoặc không khớp. Người dùng không làm gì được, chỉ nhà phát triển sửa được.

Đây là lý do phổ biến nhất. Các app mạng xã hội và nhắn tin thường mở link bằng trình duyệt nhúng của chính nó (in-app browser) để giữ bạn ở lại trong app. Link được tải ngay trong khung web đó, hệ điều hành không hề nhận được yêu cầu mở link, nên không có cơ hội chuyển sang app đích.

Điện thoại Android đang mở một ứng dụng mạng xã hội

Thoát khỏi trình duyệt nhúng

Trong trình duyệt nhúng, bấm nút ba chấm và chọn "Mở bằng trình duyệt" hoặc "Mở trong Safari/Chrome". Nhiều khi trang web lúc này sẽ hiện nút hoặc banner "Mở trong ứng dụng", bấm vào đó là vào được app.

Bạn bấm vào một link rút gọn kiểu bit.ly. Trình duyệt mở trang rút gọn trước, rồi mới chuyển hướng sang link thật shop.vn/.... Lúc chuyển hướng xong, bạn đã ở trong trình duyệt, và trên iPhone, Universal Links chỉ được kích hoạt bởi cú bấm trực tiếp của người dùng vào đúng link, nên app không được gọi nữa. Trên Android, kết quả tuỳ từng trình duyệt, nhưng link rút gọn vẫn là nguyên nhân hàng đầu khiến link "lúc được lúc không".

Khi bạn chủ động gõ hay dán shop.vn/sp/123 vào Safari hoặc Chrome, hệ điều hành hiểu là bạn muốn xem bản web, nên không giành lại. Universal Links chỉ chạy khi bạn bấm vào link trong một app khác (Ghi chú, Tin nhắn, Mail...).

Bàn tay cầm điện thoại bên cạnh thanh tìm kiếm trên nền bo mạch

Đang đọc trang Shopee trên Safari mà bấm sang một trang khác cũng của Shopee, iPhone hiểu là bạn đang duyệt web và muốn ở lại web. Universal Links chỉ kích hoạt khi bấm link từ tên miền khác sang. Đây là quy tắc có chủ đích của Apple, không phải lỗi.

6. Chính bạn đã từng chọn mở web

Trên iPhone, khi một link vừa mở vào app, góc trên bên phải màn hình hiện tên miền (ví dụ shop.vn). Nếu bạn từng bấm vào đó để quay về web, iOS sẽ ghi nhớ lựa chọn và từ đó link của tên miền này luôn mở bằng Safari. Rất nhiều người vô tình bấm một lần rồi "mất" luôn tính năng mở app mà không biết vì sao.

Cách bật lại chế độ mở app trên iPhone và Android

Trên iPhone

  1. Tìm một link của tên miền đó (trong Ghi chú hoặc Tin nhắn là tiện nhất).
  2. Nhấn giữ vào link, trong menu hiện ra chọn "Mở trong [tên app]".
  3. Từ lần sau, bấm link bình thường sẽ mở vào app trở lại.

Một cách khác: khi đang ở trang web, kéo nhẹ xuống đầu trang để hiện banner của app (nếu website có hỗ trợ) và bấm "Mở".

Trên Android

Vào Cài đặt → Ứng dụng → chọn app → Mở theo mặc định (tên mục có thể khác chút tuỳ hãng). Tại đây:

  • Bật "Mở các đường liên kết được hỗ trợ".
  • Xem danh sách tên miền: tên miền nào đã xác minh sẽ được tự động bật; tên miền chưa xác minh bạn có thể tự thêm bằng tay.

Điện thoại Android hiển thị màn hình chính

Nếu tên miền chưa được xác minh hoặc đang bị tắt, máy sẽ hỏi bạn chọn app hay trình duyệt, hoặc mở thẳng ra web. Từ Android 12, với link chưa xác minh, hệ thống mặc định mở thẳng trong trình duyệt thay vì hiện hộp thoại chọn app như trước.

  • [ ]Thử bấm link từ Ghi chú/Tin nhắn thay vì từ Facebook, Zalo
  • [ ]Kiểm tra link có phải link rút gọn không
  • [ ]iPhone: nhấn giữ link, chọn "Mở trong app"
  • [ ]Android: bật "Mở các đường liên kết được hỗ trợ" trong cài đặt app
  • [ ]Cập nhật hoặc cài lại app nếu vẫn không được

Góc nhà phát triển: kiểm tra và khắc phục

Nếu bạn làm app và nhận phản hồi "link không mở app", hãy kiểm tra theo thứ tự từ website đến thiết bị.

Kiểm tra file xác nhận trả về đúng mã 200, không chuyển hướng, đúng kiểu nội dung JSON:

bash
curl -I https://shop.vn/.well-known/apple-app-site-association
curl -I https://shop.vn/.well-known/assetlinks.json

Với iPhone, xem bản Apple CDN đang lưu (đây mới là bản thiết bị thực sự nhận được, có thể chậm hơn bản trên server):

bash
curl https://app-site-association.cdn-apple.com/a/v1/shop.vn

Với Android 12 trở lên, xem trạng thái xác minh và yêu cầu xác minh lại ngay trên máy qua adb:

bash
adb shell pm get-app-links com.shop.app
adb shell pm verify-app-links --re-verify com.shop.app

Kết quả verified nghĩa là tên miền đã khớp; các trạng thái khác (ví dụ legacy_failure, none) cho biết xác minh chưa thành công.

Vì trình duyệt nhúng chặn đường đi của Universal Links/App Links, nhà phát triển thường dùng thêm một trong hai cách:

  • Trang trung gian có nút to "Mở trong ứng dụng". Cú bấm vào nút này là một thao tác chủ động của người dùng, nên có cơ hội gọi được app; nếu máy chưa cài thì dẫn sang App Store hoặc Google Play.
  • Dịch vụ deep link của bên thứ ba: tự nhận biết thiết bị, trình duyệt nhúng, tình trạng đã cài app hay chưa, rồi chọn cách mở phù hợp, kể cả "deferred deep link" (cài app xong vẫn mở đúng sản phẩm ban đầu).

Người dùng quét mã QR bằng điện thoại để mở nội dung

Mã QR in trên bao bì, poster cũng nên trỏ tới link https:// đã cấu hình Universal Links/App Links thay vì custom scheme: quét bằng camera, máy đã có app thì vào thẳng app, chưa có thì vẫn xem được trang web.

Firebase Dynamic Links đã ngừng hoạt động

Google đã đóng dịch vụ Firebase Dynamic Links vào ngày 25/8/2025. Các app còn dùng link dạng *.page.link cần chuyển sang App Links/Universal Links tự cấu hình hoặc dịch vụ deep link khác.

Link mở được app không phải nhờ may mắn, mà nhờ ba thứ cùng đúng: app khai báo, website xác nhận, và người dùng bấm link ở nơi hệ điều hành bắt được.

Tóm tắt nhanh

  • Custom scheme (app://) là cách cũ: chết khi chưa cài app và dễ bị app khác giành tên.
  • Universal Links (iOS 9) và App Links (Android 6.0) dùng link https:// thường, có app thì mở app, không thì mở web.
  • Quyền mở link cần app khai báo trong file cài đặt và website xác nhận bằng file trong /.well-known/, đối chiếu khi cài app.
  • Link hay mở ra web vì: bắt tay hỏng, trình duyệt nhúng của Facebook/Zalo, link rút gọn, tự gõ link, bấm link cùng tên miền, hoặc bạn từng chọn quay về web.
  • iPhone: nhấn giữ link chọn "Mở trong app"; Android: bật "Mở các đường liên kết được hỗ trợ" trong cài đặt app.

Câu hỏi thường gặp

Có thể máy bạn kia chưa cài app, cài bản cũ, từng chọn quay về web, hoặc hai người bấm link từ hai nơi khác nhau (một người từ Tin nhắn, một người từ trình duyệt nhúng của Zalo).

Gỡ và cài lại app có giúp gì không?

Có, trong trường hợp lần xác minh trước bị lỗi. Cài lại khiến máy tải lại file xác nhận và đối chiếu lại từ đầu. Nhưng nếu file trên website vẫn sai, cài lại cũng không ăn thua.

An toàn hơn, vì chỉ app được chính chủ tên miền xác nhận mới nhận được link. App giả mạo không thể tự đặt file vào website của người khác.

Có. Trên iPhone, bấm tên miền ở góc trên bên phải khi link vừa mở vào app, máy sẽ nhớ và mở web từ lần sau. Trên Android, tắt "Mở các đường liên kết được hỗ trợ" trong cài đặt của app.

BVIẾT BỞIBeernary

ĐỌC TIẾP_

BÌNH LUẬN (0)

LOGIN.EXE
> ĐĂNG NHẬP ĐỂ BÌNH LUẬNDùng tài khoản Google, không cần tạo mật khẩu. Tên và ảnh đại diện Google sẽ hiện cạnh bình luận.

> CHƯA CÓ BÌNH LUẬN. HÃY LÀ NGƯỜI ĐẦU TIÊN_