URL Scheme: nó là gì, cách hoạt động và sử dụng trong phát triển

Tác giả: IT Sectr Đã đăng: 2026-05-14 Thời gian đọc: 8 phút

URL Scheme — là một giao thức URI tùy chỉnh mà ứng dụng di động đăng ký trong hệ điều hành để được mở qua các liên kết dạng myapp://path. Theo RFC 3986, lược đồ URI xác định cú pháp và ngữ nghĩa của tất cả các thành phần địa chỉ tiếp theo. Khi điều hướng đến một liên kết như vậy, hệ thống xác định ứng dụng đã đăng ký bằng mã định danh duy nhất và khởi chạy nó với các tham số được trích xuất từ liên kết. Deep link dựa trên URL Scheme vẫn là cơ chế cơ bản của điều hướng giữa các ứng dụng trên nền tảng di động, bất chấp sự xuất hiện của các giải pháp thay thế hiện đại hơn.

Những điểm chính

  • URL Scheme — một giao thức liên kết tùy chỉnh như myapp://path mà ứng dụng đăng ký để được mở từ các ứng dụng khác hoặc trình duyệt.
  • Cú pháp bao gồm lược đồ, máy chủ, đường dẫn và tham số truy vấn theo tiêu chuẩn RFC 3986, cung cấp khả năng truyền dữ liệu linh hoạt giữa các ứng dụng.
  • iOS sử dụng CFBundleURLTypes trong Info.plist và delegate AppDelegate để xử lý các URL Scheme đến với tham số điều hướng.
  • Android sử dụng Intent Filter trong AndroidManifest.xml chỉ định action, category và data để định tuyến deep link đến Activity đích.
  • Hạn chế — URL Scheme không hoạt động khi ứng dụng chưa được cài đặt, được giải quyết qua Universal Links trên iOS và App Links trên Android.

URL Scheme là gì?

URL Scheme — là một mã định danh giao thức duy nhất mà ứng dụng đăng ký trong hệ điều hành để nhận cuộc gọi qua các liên kết tùy chỉnh. Khi người dùng nhấp vào liên kết như myapp://profile/123, hệ thống xác định ứng dụng đã đăng ký lược đồ myapp và chuyển quyền điều khiển cho nó kèm URI đầy đủ. Cơ chế này cho phép các ứng dụng trao đổi dữ liệu và mở nhau mà không cần cơ sở hạ tầng máy chủ.

Khái niệm URL Scheme được vay mượn trực tiếp từ các tiêu chuẩn web RFC 3986, nơi lược đồ URI là thành phần đầu tiên của bất kỳ định danh tài nguyên phổ quát nào. Trong phát triển di động, ý tưởng này được điều chỉnh cho giao tiếp giữa các ứng dụng, nơi thay vì máy chủ HTTP, chính ứng dụng đóng vai trò là trình xử lý liên kết.

Ví dụ về URL Scheme nổi tiếng

Nhiều ứng dụng phổ biến đăng ký URL Scheme riêng để tích hợp với dịch vụ bên thứ ba. Ví dụ, Spotify sử dụng lược đồ spotify://, Telegram sử dụng tg://, và Instagram sử dụng instagram://. Các nhà phát triển cũng thường tạo lược đồ dạng appname:// cho điều hướng nội bộ và kiểm thử đầu cuối màn hình.

URL Scheme vẫn được sử dụng rộng rãi trong thông báo đẩy, bản tin email và mã QR nơi cần điều hướng tức thì đến một phần cụ thể của ứng dụng. Tuy nhiên, bắt đầu từ iOS 9 và Android 6, các cơ chế thay thế đã xuất hiện dần dần bổ sung và thay thế các lược đồ đơn giản.

Cú pháp URL Scheme: lược đồ, máy chủ và đường dẫn

Cấu trúc của một URI tùy chỉnh tuân theo đặc tả chung RFC 3986 và bao gồm nhiều thành phần. Lược đồ được chỉ định đầu tiên và được phân tách bằng dấu hai chấm khỏi phần còn lại của địa chỉ. Sau lược đồ có thể là máy chủ, cổng, đường dẫn, tham số truy vấn và đoạn, mỗi thành phần là tùy chọn.

Cú pháp đầy đủ trông như scheme://host/path?key=value#fragment. Lược đồ là yếu tố bắt buộc duy nhất; phần còn lại được xác định bởi nhu cầu của triển khai cụ thể. Dấu gạch chéo kép sau lược đồ được vay mượn lịch sử từ HTTP và không bắt buộc chặt chẽ theo đặc tả, nhưng được sử dụng phổ biến như một quy ước.

Các thành phần URI

Để biểu diễn trực quan cấu trúc URI, một bảng thành phần được sử dụng. Mỗi phần tử có mục đích và mức độ bắt buộc riêng.

Thành phầnVí dụBắt buộc
Schememyapp
HostprofileKhông
Path/user/42Không
Query?id=42&tab=mainKhông
Fragment#section2Không

Các nhà phát triển có thể tự do chọn cấu trúc URI, tạo ra sự linh hoạt nhưng gây ra vấn đề tương thích giữa các phiên bản khác nhau của ứng dụng. Nên ghi lại định dạng URL Scheme như một phần của API công khai của ứng dụng và quản lý phiên bản khi có thay đổi.

Cách URL Scheme hoạt động trên iOS

iOS yêu cầu đăng ký rõ ràng từng URL Scheme trong tệp Info.plist của dự án. Nhà phát triển thêm một mảng CFBundleURLTypes, mỗi phần tử chứa một mã định danh (CFBundleURLName) và danh sách các lược đồ được hỗ trợ (CFBundleURLSchemes). Sau khi đăng ký, hệ thống tự động chuyển hướng tất cả các cuộc gọi đến trên các lược đồ đã đăng ký đến ứng dụng.

Việc xử lý URL Scheme đến diễn ra trong delegate của ứng dụng thông qua phương thức application(_:open:options:). Phương thức này nhận một đối tượng URL từ đó đường dẫn và tham số truy vấn được trích xuất để đưa ra quyết định điều hướng. Trình xử lý phải trả về giá trị Bool cho biết sự thành công của thao tác.

Xử lý trong AppDelegate

Dưới đây là ví dụ triển khai trình xử lý URL Scheme bằng Swift. Mã này minh họa việc trích xuất máy chủ và tham số truy vấn từ URI đến bằng URLComponents.

swift
func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey: Any]
) -> Bool {
    let host = url.host
    let params = URLComponents(
        url: url,
        resolvingAgainstBaseURL: false
    )?.queryItems
    if host == "profile" {
        navigateToProfile(params)
    }
    return true
}

Phương thức sử dụng URLComponents để phân tích an toàn các tham số truy vấn. Cách tiếp cận này được ưu tiên hơn so với phân tích chuỗi thủ công vì nó tự động xử lý mã hóa phần trăm và giải mã các ký tự đặc biệt trong giá trị tham số.

Cách URL Scheme hoạt động trên Android

Android sử dụng hệ thống Intent Filter để định tuyến deep link dựa trên URL Scheme. Nhà phát triển khai báo bộ lọc trong AndroidManifest.xml bên trong thẻ Activity sẽ xử lý liên kết. Bộ lọc chứa action VIEW, các category BROWSABLE và DEFAULT, và thẻ data chỉ định lược đồ, máy chủ và pathPrefix.

Khi người dùng nhấp vào liên kết với lược đồ tùy chỉnh, hệ thống sẽ kiểm tra Intent Filter của tất cả ứng dụng đã cài đặt. Nếu tìm thấy nhiều ứng dụng phù hợp, người dùng sẽ được hiển thị hộp thoại chọn. Category BROWSABLE cho phép xử lý liên kết từ trình duyệt.

Cấu hình Intent Filter

Ví dụ khai báo Intent Filter trong AndroidManifest.xml để xử lý lược đồ myapp trên Activity. Sự kết hợp của action và category là bắt buộc để định tuyến deep link chính xác.

xml
<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category
            android:name="android.intent.category.DEFAULT" />
        <category
            android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="myapp"
            android:host="profile"
            android:pathPrefix="/user" />
    </intent-filter>
</activity>

Sau khi cấu hình bộ lọc trong Activity, cần gọi intent.getData() để lấy URI. Điều quan trọng là kiểm tra intent và dữ liệu có null không, vì Activity có thể được khởi chạy mà không có deep link đến, ví dụ trong quá trình khởi động tiêu chuẩn từ trình khởi chạy.

Truyền tham số qua URL Scheme

Các tham số truy vấn trong URL Scheme được truyền sau dấu hỏi theo định dạng khóa=giá trị, phân cách bằng dấu và. Định dạng này giống với yêu cầu HTTP và dễ dàng được xử lý bởi các công cụ tiêu chuẩn của nền tảng. Các tham số phải được mã hóa bằng mã hóa phần trăm cho tất cả các ký tự không thuộc bộ ký tự URI được phép.

Ví dụ về liên kết đầy đủ với tham số: myapp://profile?userId=42&source=email&ref=abc123. Sau khi trích xuất URL, ứng dụng phân tích tuần tự tất cả các query-items và dựa trên giá trị của chúng đưa ra quyết định điều hướng đến màn hình đích.

Giới hạn độ dài URI

Khi truyền dữ liệu phức tạp, cần xem xét giới hạn độ dài URI. Trên iOS, độ dài tối đa của URL Scheme bị giới hạn ở 2 KB, sau đó hệ thống cắt bớt liên kết. Trên Android, giới hạn khoảng 8 KB, nhưng giá trị chính xác phụ thuộc vào phiên bản hệ điều hành và nhà sản xuất thiết bị. Đối với khối lượng dữ liệu lớn, nên chỉ truyền mã định danh phiên qua URL Scheme và tải phần còn lại từ máy chủ.

Hạn chế và giải pháp thay thế URL Scheme

Nhược điểm chính của URL Scheme là không thể xử lý liên kết nếu ứng dụng chưa được cài đặt trên thiết bị. Trình duyệt hiển thị lỗi và người dùng mất ngữ cảnh điều hướng. Để giải quyết vấn đề này, Apple đã giới thiệu Universal Links trong iOS 9 và Google đã giới thiệu App Links trong Android 6. Cả hai cơ chế đều được đăng ký thông qua tên miền web liên kết với ứng dụng.

Universal Links và App Links hoạt động như các liên kết HTTPS thông thường, nhưng khi ứng dụng được cài đặt, chúng mở ứng dụng mà không có hộp thoại chọn. Nếu ứng dụng chưa được cài đặt, liên kết mở một trang web trên cùng tên miền, bảo tồn trải nghiệm người dùng. Điều này làm cho chúng trở thành giải pháp thay thế ưu tiên cho môi trường sản xuất.

Cơ chế dự phòng

Đối với URL Scheme trên iOS và Android, không có cơ chế dự phòng tích hợp. Các nhà phát triển sử dụng giải pháp máy chủ trung gian: liên kết dẫn đến một trang web kiểm tra xem ứng dụng đã được cài đặt chưa qua JavaScript và chuyển hướng đến lược đồ hoặc cửa hàng ứng dụng. Firebase Dynamic Links và Branch.io cung cấp các giải pháp có sẵn cho vấn đề này với hỗ trợ deep link hoãn lại tự động xác định trạng thái cài đặt và định tuyến người dùng mà không cần phát triển đường ống máy chủ tùy chỉnh.

Sự phức tạp bổ sung phát sinh khi sử dụng URL Scheme trên iOS 15+ và Android 12+, nơi các quy tắc bảo mật đã được thắt chặt. Safari chặn các nỗ lực mở lược đồ chưa đăng ký mà không có xác nhận trước, và Android 12 hạn chế khả năng hiển thị của các ứng dụng đã cài đặt qua PackageManager. Những thay đổi này làm cho việc sử dụng URL Scheme cho giao tiếp giữa các ứng dụng kém tin cậy hơn so với các phiên bản nền tảng trước đó.

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

URL Scheme khác Universal Links như thế nào?

URL Scheme sử dụng giao thức tùy chỉnh không mã hóa, trong khi Universal Links hoạt động qua HTTPS với xác minh tên miền. Universal Links không hiển thị hộp thoại chọn ứng dụng và được xử lý chính xác ngay cả khi ứng dụng chưa được cài đặt trên thiết bị.

URL Scheme có thể chứa ký tự Cyrillic không?

Có, nhưng tất cả các ký tự không phải ASCII phải được mã hóa thông qua mã hóa phần trăm theo RFC 3986. Nên tránh ký tự Cyrillic trong URL Scheme để đảm bảo tương thích với các phiên bản hệ điều hành và trình duyệt cũ.

Một ứng dụng có thể đăng ký bao nhiêu URL Scheme?

Không có giới hạn về số lượng lược đồ trên cả iOS và Android. Trong thực tế, các ứng dụng sử dụng từ một đến năm lược đồ. Ví dụ, Telegram đăng ký các lược đồ tg://, t.me/, telegram:// và telegram.me://.

Làm thế nào để kiểm tra thiết bị có hỗ trợ URL Scheme của tôi không?

Trên iOS, phương thức canOpenURL(_:) được sử dụng, trả về true nếu lược đồ đã được đăng ký. Trên Android, việc kiểm tra được thực hiện qua PackageManager.queryIntentActivities(). Cả hai nền tảng đều yêu cầu chỉ định trước lược đồ trong cấu hình.

Có thể truyền mật khẩu qua URL Scheme không?

Không, URL Scheme không mã hóa dữ liệu. Bất kỳ ứng dụng nào đăng ký cùng lược đồ đều có thể chặn liên kết. Để bảo mật, hãy sử dụng Universal Links với HTTPS hoặc mã hóa đầu cuối ở cấp độ giao thức.

Tổng kết

  • URL Scheme — một giao thức URI tùy chỉnh cho tương tác giữa các ứng dụng trên nền tảng di động theo tiêu chuẩn RFC 3986.
  • Đăng ký lược đồ được thực hiện trong Info.plist cho iOS và trong AndroidManifest.xml cho Android qua cơ chế Intent Filter.
  • Xử lý liên kết đến trên iOS diễn ra qua delegate của ứng dụng, trên Android — qua intent.getData() trong Activity đích.
  • Tham số được truyền qua chuỗi truy vấn với mã hóa phần trăm và giới hạn độ dài lên đến 2 KB trên iOS.
  • Hạn chế — URL Scheme không hoạt động khi ứng dụng chưa được cài đặt; cần Universal Links hoặc App Links để dự phòng thích hợp.
  • Giải pháp thay thế — Universal Links (iOS), App Links (Android) và các nền tảng thương mại Firebase Dynamic Links và Branch.io.
  • Bảo mật — URL Scheme không mã hóa dữ liệu, do đó không phù hợp để truyền thông tin bảo mậ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.

Thảo luận dự án

Đọc thêm