Deep link và App Link: mở thẳng đúng màn hình trong ứng dụng

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Bạn bấm vào một liên kết sản phẩm trong tin nhắn và ứng dụng mở thẳng trang sản phẩm đó. Đó là deep link. Tính năng này giúp quảng cáo, email, thông báo và chia sẻ dẫn người dùng đúng chỗ cần đến, thay vì chỉ mở màn hình chủ.

Ba kiểu liên kết cần phân biệt

  • URI scheme tùy biến: dạng myapp://product/42. Dễ cấu hình nhưng bất kỳ ứng dụng nào cũng có thể đăng ký cùng scheme, và nếu chưa cài ứng dụng thì liên kết không làm gì hữu ích.
  • Android App Links: liên kết HTTPS thật (ví dụ https://example.com/product/42) được xác minh quyền sở hữu tên miền để mở thẳng ứng dụng, không hiện hộp chọn.
  • iOS Universal Links: tương tự App Links cho iOS, dùng liên kết HTTPS và tệp liên kết với tên miền.

Với sản phẩm thật, hãy ưu tiên App Links và Universal Links vì an toàn hơn và quay về trang web khi chưa cài ứng dụng.

Xác minh quyền sở hữu tên miền

Để hệ điều hành tin rằng ứng dụng thuộc về tên miền đó, bạn đặt một tệp JSON trên máy chủ web.

Trên Android, tệp assetlinks.json nằm ở /.well-known/assetlinks.json:

[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.example.app",
      "sha256_cert_fingerprints": ["AA:BB:CC:...:ZZ"]
    }
  }
]

Trên iOS, tệp apple-app-site-association khai báo ứng dụng nào xử lý đường dẫn nào, và ứng dụng khai báo tên miền liên kết (Associated Domains) trong cấu hình dự án. Cả hai tệp phải truy cập được qua HTTPS không chuyển hướng.

Khai báo trong ứng dụng Android

<activity android:name=".MainActivity" 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>

Xử lý liên kết trong ứng dụng

Khi nhận liên kết, ứng dụng cần phân tích đường dẫn và điều hướng đến màn hình tương ứng. Với Flutter dùng go_router, đường dẫn khai báo sẵn sẽ tự khớp:

GoRoute(
  path: '/product/:id',
  builder: (context, state) =>
      ProductPage(id: state.pathParameters['id']!),
),

Với React Navigation, bạn cấu hình thuộc tính linking để ánh xạ đường dẫn vào các màn hình:

const linking = {
  prefixes: ['https://example.com', 'myapp://'],
  config: {
    screens: {
      Home: '',
      Product: 'product/:id',
    },
  },
};

<NavigationContainer linking={linking}>{/* ... */}</NavigationContainer>

Các tình huống cần xử lý

  1. Ứng dụng đã mở: điều hướng tới màn hình đích trên ngăn xếp hiện có.
  2. Ứng dụng đang đóng: khởi động rồi lấy liên kết ban đầu để điều hướng.
  3. Chưa cài ứng dụng: liên kết HTTPS mở trang web; trang đó có thể dẫn đến cửa hàng ứng dụng.
  4. Cần đăng nhập: lưu đích đến, đưa người dùng qua đăng nhập rồi chuyển tiếp đến đúng màn hình.
  5. Đường dẫn không hợp lệ: hiển thị trang báo lỗi thân thiện hoặc về màn hình chủ.

Kiểm thử

Bạn có thể thử bằng dòng lệnh. Với Android dùng adb:

adb shell am start -a android.intent.action.VIEW -d "https://example.com/product/42"

Với iOS, dùng lệnh xcrun simctl openurl trên trình giả lập hoặc dán liên kết vào ghi chú rồi bấm. Nhớ kiểm tra cả trường hợp ứng dụng bị đóng hoàn toàn.

Lưu ý bảo mật

  • Coi dữ liệu trong liên kết là không đáng tin; kiểm tra và làm sạch tham số.
  • Không đưa thông tin nhạy cảm như token vào liên kết.
  • Với thao tác quan trọng (thanh toán, đổi mật khẩu) vẫn yêu cầu xác nhận trong ứng dụng.

Kết luận

Deep link nối liền web, quảng cáo và ứng dụng, làm trải nghiệm liền mạch. Ưu tiên liên kết HTTPS được xác minh, ánh xạ rõ ràng đường dẫn vào màn hình và kiểm thử đủ ba trạng thái của ứng dụng.

Ứng dụng của deep link trong thực tế

Deep link không chỉ để chia sẻ. Email đặt lại mật khẩu mở thẳng màn hình nhập mật khẩu mới, mã QR dẫn tới một sản phẩm, thông báo đẩy mở đúng cuộc trò chuyện, chiến dịch quảng cáo dẫn đến trang khuyến mại. Hãy lên danh sách các đường dẫn quan trọng của ứng dụng và thiết kế sơ đồ URL từ đầu, giữ chúng ổn định theo thời gian vì liên kết đã gửi ra ngoài không thể thu hồi. Khi đổi cấu trúc màn hình, vẫn nên giữ đường dẫn cũ hoạt động hoặc chuyển hướng sang đường dẫn mới.

Liên kết trì hoãn khi chưa cài ứng dụng

Một bài toán thực tế là người dùng bấm liên kết khi chưa cài ứng dụng. Nếu chỉ mở trang web, họ có thể mất ngữ cảnh sau khi cài. Các dịch vụ liên kết trì hoãn (deferred deep link) giải quyết bằng cách ghi nhớ đích đến và mở đúng màn hình sau lần chạy đầu tiên. Bạn có thể dùng dịch vụ bên thứ ba hoặc tự xây bằng tham số tham chiếu của cửa hàng, nhưng hãy cân nhắc quyền riêng tư và quy định về theo dõi.

Để học cách tích hợp ứng dụng với web và máy chủ, bạn có thể xem các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment