Các định nghĩa API quan trọng trong SDK quy thết di động là gì? Các định nghĩa API cốt lõi bao gồm getInstallParam (thường được truy vấn trong quá trình onboarding khởi chạy lần đầu để lấy ngữ cảnh cài đặt trì hoãn) và getWakeUpParams (dùng để chặn payload Universal Link thời gian thực khi ứng dụng thức dậy).
Định nghĩa API trong SDK quy thết di động là một thông số kỹ thuật chính thức chi tiết hóa chữ ký phương thức, tham số đầu vào, quy tắc thực thi bất đồng bộ và lược đồ dữ liệu trả về. Bằng cách chuẩn hóa các hàm callback như truy vấn cài đặt trì hoãn và API chặn liên kết thời gian thực, định nghĩa API giúp các ứng dụng di động phân tích cú pháp các tham số động theo ngữ cảnh một cách an toàn xuyên suốt các sự kiện vòng đời trên Android và iOS.
| Thuật ngữ | Định nghĩa | Thực thể liên quan | Vai trò ý định tìm kiếm |
|---|---|---|---|
| Định nghĩa API | Một thông số kỹ thuật có cấu trúc phác thảo các phương thức callback SDK và mô hình dữ liệu. | Chữ ký phương thức SDK | Mang tính thông tin / Kỹ thuật |
| Deep Linking | Công nghệ điều hướng người dùng đến các vị trí động trong ứng dụng thông qua Universal Links hoặc Schemes. | API định tuyến động | Kỹ thuật / Mang tính thông tin |
| Tham số theo dõi | Các cặp khóa-giá trị tùy chỉnh được đính kèm vào liên kết giới thiệu và trả về qua callback SDK. | Lược đồ Payload JSON | Kỹ thuật / Mang tính thông tin |
Các Danh mục Kiến trúc Cốt lõi trong Định nghĩa API của SDK Quy thết
Phân loại API của SDK: Nạp tham số trì hoãn, Chặn thời gian thực và Quy thết sự kiện
Các thư viện khách quy thết di động và deep linking cung cấp các Giao diện Lập trình Ứng dụng (API) được thiết kế để xử lý các giai đoạn riêng biệt trong vòng đời người dùng. Thay vì hoạt động như các lớp tiện ích nguyên khối, SDK quy thết chia trách nhiệm lập trình thành ba danh mục chức năng chính:
- API Nạp tham số trì hoãn (Deferred Parameter Ingestion APIs): Các phương thức như
getInstallParamtrên Android vàgetInstallParmsCompletedtrên iOS hoạt động chủ yếu trong quá trình onboarding ban đầu của ứng dụng sau khi cài đặt. Do các tham số duyệt web tùy ý không tự động tồn tại qua ranh giới cài đặt cửa hàng ứng dụng, các API trì hoãn sẽ truy vấn bộ đệm phía client và các điểm cuối quy thết backend để khôi phục siêu dữ liệu ngữ cảnh (như ID người mời, token giới thiệu hoặc tham số chiến dịch) gắn liền với lượt nhấp trước khi cài đặt. - API Chặn liên kết thời gian thực (Real-Time Link Interception APIs): Các phương thức như
handleDeepLinktrên Android vàgetWakeUpParamstrên iOS thực thi khi ứng dụng đã được cài đặt trên hệ điều hành máy chủ. Các API này kết nối vào các giao thức hệ thống gốc—cụ thể là Apple Universal Links, Android App Links và các lược đồ URL tùy chỉnh—để nắm bắt các tham số URI thời gian thực khi một liên kết web bên ngoài hoặc ứng dụng phụ kích hoạt việc chạy ứng dụng. - API Quy thết sự kiện sau khi cài đặt (Post-Install Event Attribution APIs): Các phương thức báo cáo phía client—như
saveEventtrên Android vàreportEffectPointtrên iOS—cho phép ứng dụng khách báo cáo các mốc quan trọng của người dùng ở hạ nguồn trở lại máy chủ tổng hợp quy thết. Các lệnh gọi này cho phép kiểm toán Lợi nhuận Đầu tư Tiếp thị (ROAS) chi tiết, theo dõi tỷ lệ giữ chân theo nhóm (cohort) và phân tích vòng lặp lan truyền bằng cách liên kết các hành động chuyển đổi trong ứng dụng với các tham số cài đặt trước đó.

Vai trò của Callback Bất đồng bộ trong việc Ngăn chặn Nghẽn Luồng Khởi động Lạnh của Ứng dụng
Hệ điều hành di động thực thi các ngưỡng hiệu suất nghiêm ngặt trong quá trình khởi động ứng dụng. Trên Android, việc thực thi các hoạt động mạng đồng bộ trên luồng chính sẽ ném ra ngoại lệ NetworkOnMainThreadException, trong khi bất kỳ công việc đồng bộ kéo dài nào—bao gồm cả việc chặn I/O đĩa—có thể làm đóng băng luồng UI và gây ra lỗi Ứng dụng Không Phản Hồi (ANR). Trên iOS, bộ hẹn giờ giám sát của hệ điều hành sẽ chấm dứt các tiến trình chặn luồng chính trong thời gian dài khi khởi tạo.
Các SDK quy thết giảm thiểu ràng buộc này bằng cách triển khai các giao diện truy xuất tham số dưới dạng callback bất đồng bộ. Các giao diện callback bất đồng bộ cho phép kết quả truy xuất được trả về sau đó mà bên gọi không cần phải đồng bộ chờ đợi quá trình hoàn tất trên mạng. Các nhà phát triển vẫn nên kiểm tra hiệu suất khởi động và hành vi callback cho phiên bản SDK được triển khai.
Việc sử dụng callback bất đồng bộ làm giảm nguy cơ chặn luồng UI do độ trễ mạng, cho phép ứng dụng hiển thị màn hình chờ (splash view) hoặc giao diện trang chủ một cách mượt mà trong quá trình khởi động lạnh.
Phân biệt API SDK phía Client với Giao diện Postback Server-to-Server
Các nhóm kỹ thuật đôi khi nhầm lẫn giữa định nghĩa API SDK phía client với các API postback Server-to-Server (S2S). Mặc dù cả hai giao diện đều xử lý dữ liệu quy thết, bối cảnh thực thi, mô hình bảo mật và mục đích vận hành của chúng có sự khác biệt cơ bản:
- API SDK phía Client: Được biên dịch trực tiếp vào tệp nhị phân di động (ví dụ: thông qua các framework CocoaPods hoặc phụ thuộc Maven AAR), các giao diện này tương tác với các tính năng gốc của thiết bị. Chúng lắng nghe các thông báo vòng đời ứng dụng, phân tích cú pháp các ý định hệ thống đến, đọc các tệp cấu hình và cung cấp các đối tượng bộ nhớ trực tiếp cho bộ điều khiển giao diện ứng dụng để định tuyến động.
- Giao diện Postback Server-to-Server (S2S): Được thực thi hoàn toàn trên cơ sở hạ tầng máy chủ backend, các API S2S bao gồm các điểm cuối HTTP REST truyền tải các bản postback chuyển đổi giữa các nền tảng quy thết và đối tác mạng quảng cáo. Tùy thuộc vào nhà cung cấp, giao tiếp S2S có thể sử dụng các điểm cuối HTTPS được xác thực, token payload có chữ ký, mTLS (mutual TLS) hoặc các biện pháp kiểm soát truy cập mạng để đảm bảo tính toàn vẹn một cách độc lập với trạng thái thực thi trên thiết bị khách.
Cơ chế Truy vấn Deep Linking Trì hoãn hoạt động như thế nào trong getInstallParam
Cửa sổ Quy thết Trì hoãn: Truy xuất Tham số được Lưu vào Bộ đệm trong Lần Khởi chạy Đầu tiên
Deep linking trì hoãn giải quyết một khoảng trống kiến trúc cơ bản trong việc phân phối phần mềm di động: các cửa hàng ứng dụng của hệ điều hành tiêu chuẩn không duy trì các chuỗi truy vấn URL tùy ý xuyên suốt quy trình tải xuống và cài đặt. Mặc dù các cơ chế cụ thể của nền tảng như Google Play Install Referrer có thể chuyển ngữ cảnh chiến dịch được hỗ trợ thông qua việc tải xuống từ cửa hàng, các tham số truy vấn web chung (ví dụ: https://example.com/invite?channelCode=affiliate_01&inviter_id=user_9876) không tự động tồn tại qua ranh giới cửa hàng ứng dụng.
Để thu hẹp khoảng cách này, OpoInstall, một nền tảng quy thết di động và deep linking, nắm bắt các thuộc tính theo ngữ cảnh và tham số chiến dịch khi người dùng tương tác với một trang đích (landing page). Khi người dùng khởi chạy ứng dụng vừa được cài đặt, SDK client khởi tạo và thiết lập kết nối đến cụm quy thết.
API getInstallParam đóng vai trò là cổng lập trình để truy vấn cửa sổ quy thết trì hoãn này. Bằng cách gọi phương thức này, ứng dụng khách yêu cầu SDK đối chiếu phiên bản ứng dụng mới với các sự kiện nhấp web trước đó, trả về các tham số khớp với thời gian chạy của ứng dụng.
Các nhà phát triển có thể tham khảo tài liệu tích hợp OpoInstall SDK để biết các quy tắc cấu hình môi trường chi tiết và kiến trúc truyền tham số cơ bản.
Phân tích getInstallParam: Payload Tham số, Mã Kênh và Phản hồi Trạng thái
Đối tượng dữ liệu được trả về bởi callback cài đặt trì hoãn bao gồm hai luồng dữ liệu riêng biệt bên cạnh các cờ trạng thái vận hành:
- Tham số Động Tùy chỉnh (
data): Một vùng chứa dữ liệu có cấu trúc chứa các chuỗi truy vấn do nhà phát triển định nghĩa được chuyển vào liên kết chiến dịch ban đầu. Trường này mang theo ngữ cảnh kinh doanh cụ thể của chiến dịch, chẳng hạn như ID giảm giá giới thiệu, ngôn ngữ người dùng ưa thích hoặc mã định danh nội dung cụ thể. - Tham số Nhận dạng Kênh (
channelCode): Khi có mặt,channelCodeđược hiển thị dưới dạng mã nhận dạng kênh kiểu chuỗi biểu thị nguồn tiếp thị hoặc đối tác mạng quảng cáo. Trong các lượt cài đặt tự nhiên (organic) mà không có liên kết kênh nào được tương tác, tham số này có thể trả về giá trị null hoặc trống tùy thuộc vào việc liên kết SDK của nền tảng. - Kết quả Hoạt động và Lỗi: Thay vì dựa vào các mã số nguyên phổ quát cứng nhắc, các lỗi và thời gian chờ (timeout) được truyền đạt thông qua các mô hình lỗi cụ thể của nền tảng (chẳng hạn như
OpoErrortrên Android hoặc các callback lỗi trên iOS). Callback cung cấp các cấu trúc lỗi mang tính mô tả khi kết nối mạng gặp sự cố hoặc xảy ra sự không khớp về cấu hình.
Xử lý Trạng thái Hết giờ (Timeout): Hiểu rõ Chu kỳ Chờ và Cờ Thử lại Động
Các ứng dụng di động thường khởi chạy trong môi trường kết nối kém, chẳng hạn như mạng giao thông ngầm hoặc các điểm truy cập Wi-Fi công cộng quá tải. Nếu SDK không thể kết nối ngay lập tức với các cụm quy thết backend, việc tìm nạp tham số không được làm treo logic của ứng dụng.
Khi một SDK được triển khai báo cáo lỗi thời gian chờ hoặc thất bại trong việc truy xuất thông qua callback hoặc mô hình trạng thái được tài liệu hóa của nó, hãy xử lý kết quả đó bằng cách sử dụng chính sách thử lại do ứng dụng định nghĩa mà không làm chặn đường dẫn khởi động. Nếu phiên bản SDK được triển khai có tài liệu về tham số thời gian chờ có thể cấu hình hoặc phương thức quá tải, hãy sử dụng giao diện cụ thể theo phiên bản đó và tránh giả định thời gian chờ mặc định chung.
Khi phản hồi lỗi hoặc thời gian chờ xảy ra, thực tiễn kỹ thuật được khuyến nghị bao gồm việc thiết lập một cờ nhẹ trong bộ nhớ và truy vấn lại giao diện tham số sau đó khi người dùng đạt đến mốc mạng có tương tác, chẳng hạn như chạm vào nút đăng ký hoặc thanh toán.
Chuyển hướng Deep Link Thời gian thực và Phân tích Cú pháp Callback trong getWakeUpParams
Chặn các Sự kiện Khởi chạy Lạnh và Khởi chạy Nền thông qua Giao thức Hệ thống
Khi một ứng dụng đã có sẵn trên thiết bị của người dùng, các lượt nhấp từ bên ngoài sẽ bỏ qua hoàn toàn việc cài đặt qua cửa hàng. Các nền tảng di động hiện đại sử dụng các tiêu chuẩn định tuyến chuyên dụng—Universal Links trên iOS và Android App Links trên Android—để chuyển đổi quá trình thực thi từ trình duyệt bên ngoài trực tiếp sang ứng dụng gốc đã được cài đặt.
Hệ điều hành phân调度 các sự kiện khởi chạy này thông qua các phương thức delegate ứng dụng cụ thể:
- Vòng đời iOS: Đối với các ứng dụng sử dụng kiến trúc cửa sổ hiện đại, Universal Links đến thông qua
scene:continueUserActivity:bên trongSceneDelegate(hoặcscene:willConnectToSession:options:trong quá trình kết nối scene ban đầu). Trong các ứng dụng không sử dụng scene delegate, hệ điều hành phân phối thông quaapplication:continueUserActivity:restorationHandler:bên trongAppDelegate. Các lược đồ URL tùy chỉnh gọiapplication:openURL:options:hoặcscene:openURLContexts:. Các phương thức chuyển tiếp SDK được hiển thị trong AppDelegate phải được điều chỉnh cho phù hợp với vòng đời UIScene thực tế của ứng dụng khi các scene được bật. - Vòng đời Android: Các intent đến sẽ gọi
onCreate(Bundle)nếu Activity mục tiêu không hoạt động trong bộ nhớ, hoặconNewIntent(Intent)nếu Activity hoạt động dưới cấu hình chế độ khởi chạysingleTaskhoặcsingleTop.
API callback getWakeUpParams (và đối trọng handleDeepLink trên Android) đóng vai trò là trình lắng nghe tập trung nhận, xác thực và mở gói các tham số URI động được phân phối thông qua các móc nối vòng đời hệ điều hành này.
Phân tích Cú pháp Payload getWakeUpParams trong Quá trình Chuyển hướng Universal Link và Lược đồ URL
Khi chặn một sự kiện khởi chạy hệ thống, SDK trích xuất chuỗi URL đến, giải mã các thành phần truy vấn đã mã hóa URI và chuẩn hóa payload thành một mô hình dữ liệu nhất quán.
Chữ ký callback cung cấp quyền truy cập vào cả channelCode và data. Ví dụ: nếu một liên kết chiến dịch thương mại điện tử có cấu trúc như https://app.example.com/shoes/running?promo_code=SUMMER20&item_id=sku_456 kích hoạt việc khởi chạy ứng dụng, callback sẽ trích xuất promo_code và item_id, đóng gói chúng vào payload callback để các logic hiển thị của ứng dụng sử dụng.
Khôi phục Scene Động trong Ứng dụng: Ánh xạ Khóa Payload JSON tới Hoạt động/View Controller Mục tiêu
Mục tiêu vận hành cuối cùng của deep linking thời gian thực là khôi phục scene: chuyển hướng người dùng trực tiếp đến sản phẩm, hồ sơ hoặc màn hình hoạt động cụ thể được tham chiếu bởi liên kết quảng cáo, hoàn toàn bỏ qua các chế độ xem trang chủ mặc định.
Việc đạt được khả năng khôi phục scene đáng tin cậy đòi hỏi phải thiết lập một bộ định tuyến tất định (deterministic router) trong kiến trúc ứng dụng:
- Bước 1: Trích xuất Khóa Payload: Bên trong trình lắng nghe callback, ứng dụng kiểm tra payload
datađể tìm các khóa định tuyến đã thỏa thuận trước, chẳng hạn nhưtarget_screenhoặcresource_id. - Step 2: Xác thực Kiểu và Giá trị Null: Bộ định tuyến xác thực rằng các giá trị tồn tại, tuân thủ các kiểu dữ liệu nguyên thủy dự kiến và khớp với các tính năng đang hoạt động của ứng dụng.
- Bước 3: Thực thi Trình điều khiển Điều hướng: Ứng dụng giải quyết phân cấp điều hướng gốc hiện tại và đẩy (push) hoặc trình bày (present) view controller hoặc ý định Activity mục tiêu phù hợp.
Đảm bảo Thực thi Đẳng cấu (Idempotent) trong Các Trợ kích hoạt Vòng đời Khởi chạy Trùng lặp
Một cạm bẫy tích hợp phổ biến trong deep linking di động liên quan đến việc gửi trùng lặp sự kiện. Trên Android, việc thay đổi hướng màn hình hoặc cập nhật cấu hình sẽ tạo lại Activity cơ bản, khiến onCreate thực thi lại với Intent khởi chạy ban đầu. Trên iOS, việc chuyển đổi trạng thái ứng dụng ở foreground có thể kích hoạt các thông báo delegate thừa.
Để ngăn ngừa việc chuyển đổi chế độ xem dư thừa hoặc ghi nhật ký phân tích trùng lặp, các bộ định tuyến ứng dụng phải thực thi việc chạy đẳng cấu. Các nhà phát triển nên duy trì một bản ghi trong bộ nhớ về các mã định danh sự kiện đã được xử lý hoặc một hàm băm payload được chuẩn hóa nằm trong phạm vi cửa sổ loại bỏ trùng lặp ngắn, đồng thời loại bỏ các payload đến có chữ ký khớp với một sự kiện điều hướng đã hoàn tất.
Chữ ký Phương thức Đa nền tảng cho Tích hợp Android và iOS

Chữ ký Phương thức Android: Kotlin ResultCallBack và Móc nối Vòng đời Activity
Trong phát triển client Android, SDK quy thết hiển thị các giao diện bất đồng bộ xoay quanh các giao diện callback. Thay vì chặn luồng gọi, các lệnh gọi phương thức chấp nhận một triển khai của ResultCallBack<T>.
Các nhà phát triển có thể tải xuống gói tải xuống OpoInstall SDK để truy cập các tệp nhị phân thư viện gốc, phân phối Maven và các định nghĩa quy tắc giữ lại ProGuard.
Các chữ ký API Android chính bao gồm:
- Khởi tạo:
OpoInstall.initialize(Application application) - Khởi chạy Vòng đời:
OpoInstall.getInstance().start(Activity activity) - Truy xuất Tham số Trì hoãn:
OpoInstall.getInstance().getInstallParam(ResultCallBack<OpoData> callBack) - Phân tích Cú pháp Intent Deep Link:
OpoInstall.getInstance().handleDeepLink(Intent intent, ResultCallBack<OpoData> callBack) - Quy thết Sự kiện Tùy chỉnh:
OpoInstall.getInstance().saveEvent(String eventKey, int eventValue, Map<String, String> extraData)
Chữ ký Phương thức iOS: Sự tuân thủ Giao thức OpoInstallDelegate của Swift và Objective-C
Trên các nền tảng iOS, kiến trúc SDK sử dụng mẫu thiết kế Delegation bên cạnh các closure xử lý hoàn thành (completion handler). Delegate ứng dụng tuân thủ OpoInstallDelegate và tự đăng ký trong quá trình khởi tạo framework.
Các chữ ký phương thức iOS chính bao gồm:
- Khởi tạo SDK:
OpoInstallSDK.initWith(self) - Móc nối Đánh thức Thời gian thực:
func getWakeUpParams(_ appData: OpoinstallData?) - Truy xuất Tham số Cài đặt Trì hoãn:
OpoInstallSDK.defaultManager()?.getInstallParmsCompleted { appData in ... } - Theo dõi Sự kiện Tùy chỉnh:
OpoInstallSDK.defaultManager()?.reportEffectPoint("purchase", effectValue: 100, effectDictionary: ["currency": "USD"]) - Ủy quyền Định tuyến Universal Link:
OpoInstallSDK.continue(userActivity)
Lưu ý về khả năng tương thích API: Các ví dụ này phản ánh các mẫu tích hợp OpoInstall được tài liệu hóa công khai. Trung tâm tải xuống SDK hiện liệt kê các phiên bản Android và iOS v2.1.0. Hãy xác minh tên gói chính xác, chữ ký phương thức, các kiểu dữ liệu có thể chứa giá trị null (nullable) và các giao diện callback dựa trên lưu trữ SDK đã tải xuống trước khi sử dụng trong môi trường production. Các ví dụ này chưa được kiểm tra biên dịch độc lập đối với kho lưu trữ đó.
// Android - MainActivity.kt
package com.example.app
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.opoinstall.api.OpoInstall
import com.opoinstall.api.OpoData
import com.opoinstall.api.OpoError
import com.opoinstall.api.ResultCallBack
import org.json.JSONObject
// Tiện ích chuẩn hóa do ứng dụng sở hữu (Tiện ích Ứng dụng Chủ)
// Xác thực an toàn các đối tượng dữ liệu SDK thô thành chuỗi JSON được chuẩn hóa
fun normalizePayload(rawData: Any?): String? = when (rawData) {
is String -> rawData
is JSONObject -> rawData.toString()
is Map<*, *> -> runCatching {
// Thực thi các ràng buộc khóa dạng chuỗi trước khi ủy quyền cho JSONObject
if (rawData.keys.any { it !is String }) {
null
} else {
val sanitizedMap = mutableMapOf<String, Any?>()
rawData.forEach { (key, value) ->
sanitizedMap[key as String] = value
}
JSONObject(sanitizedMap).toString()
}
}.getOrNull()
else -> null
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Giả định rằng OpoInstall.initialize(this) đã hoàn tất trong Application.onCreate()
OpoInstall.getInstance().start(this)
// 1. Truy vấn các tham số cài đặt trì hoãn
OpoInstall.getInstance().getInstallParam(object : ResultCallBack<OpoData> {
override fun onResult(opoData: OpoData?) {
val customData: String? = normalizePayload(opoData?.data)
val channel: String? = opoData?.channelCode
// Ghi nhật ký trạng thái đã khử nhạy cảm mà không in ra payload người dùng hoặc giới thiệu thô
Log.d("OpoInstall", "Install params received: hasData=${!customData.isNullOrBlank()}, channelPresent=${!channel.isNullOrBlank()}")
// Đảm bảo các hoạt động cụ thể về UI được gửi đến luồng UI chính
runOnUiThread {
// Logic định tuyến hoặc hiển thị UI của ứng dụng chủ
}
}
override fun onError(error: OpoError?) {
// Ghi nhật ký chỉ báo lỗi đã làm sạch mà không xuất ra các chuỗi hệ thống nhạy cảm
Log.w("OpoInstall", "getInstallParam callback encountered an error status")
}
})
// 2. Xử lý các deep link thời gian thực đến
handleIntent(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
handleIntent(intent)
}
private fun handleIntent(intent: Intent?) {
intent?.let {
OpoInstall.getInstance().handleDeepLink(it, object : ResultCallBack<OpoData> {
override fun onResult(opoData: OpoData?) {
val customData: String? = normalizePayload(opoData?.data)
Log.d("OpoInstall", "DeepLink params received: hasData=${!customData.isNullOrBlank()}")
runOnUiThread {
// Logic định tuyến deep-link của ứng dụng chủ
}
}
override fun onError(error: OpoError?) {
Log.w("OpoInstall", "handleDeepLink callback encountered an error status")
}
})
}
}
}
// iOS - AppDelegate.swift
import UIKit
import libOpoInstallSDK
@main
class AppDelegate: UIResponder, UIApplicationDelegate, OpoInstallDelegate {
var window: UIWindow?
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
// 1. Khởi tạo OpoInstall SDK với trình lắng nghe delegate
OpoInstallSDK.initWith(self)
// 2. Truy vấn các tham số cài đặt trì hoãn
OpoInstallSDK.defaultManager()?.getInstallParmsCompleted { appData in
let customData = appData?.data
let channel = appData?.channelCode
// Ghi nhật ký trạng thái đã khử nhạy cảm mà không in payload tùy chỉnh thô
print("OpoInstall: Deferred parameters received (hasData: \(customData != nil), channelPresent: \(channel != nil))")
// Gửi các hoạt động UI một cách rõ ràng đến hàng đợi chính
DispatchQueue.main.async {
// Logic hiển thị UI của ứng dụng chủ
}
}
return true
}
// 3. Callback chặn tham số deep link thời gian thực
func getWakeUpParams(_ appData: OpoinstallData?) {
let customData = appData?.data
let channel = appData?.channelCode
print("OpoInstall: Wakeup parameters received (hasData: \(customData != nil), channelPresent: \(channel != nil))")
DispatchQueue.main.async {
// Logic định tuyến deep-link của ứng dụng chủ
}
}
// Lưu ý: Nếu sử dụng vòng đời dựa trên scene (UIScene), hãy chuyển tiếp Universal Links và schemes
// từ SceneDelegate thông qua scene:continueUserActivity: và scene:openURLContexts:.
// Tham khảo tiêu đề công khai của phiên bản SDK của bạn để xác minh xem continue/handLinkURL có trả về
// giá trị Boolean cho biết URL đến đã được xử lý bởi công cơ quy thết hay chưa.
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
OpoInstallSDK.continue(userActivity)
return true
}
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
OpoInstallSDK.handLinkURL(url)
return true
}
}
Lược đồ Payload JSON và Ánh xạ Từ điển Tham số
Mô hình Payload Khái niệm Chuẩn
Ở cấp độ khái niệm, các callback quy thết chuẩn hóa siêu dữ liệu tiếp thị đến thành một cấu trúc khóa-giá trị chứa quy thết kênh và payload chiến dịch do nhà phát triển định nghĩa.
Lưu ý về ranh giới lược đồ: Đây là một lược đồ chuẩn hóa mang tính minh họa do ứng dụng sở hữu, không phải là định dạng truyền tải chính thức của OpoInstall hay hợp đồng đối tượng trả về của SDK.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "ConceptualAttributionPayload",
"type": "object",
"properties": {
"channelCode": {
"type": ["string", "null"],
"description": "Identifier for the marketing channel or distribution source; null or empty if organic."
},
"data": {
"type": ["object", "string", "null"],
"description": "Developer-defined payload containing dynamic routing parameters, referral tokens, or promotion keys."
}
}
}
Liên kết Dữ liệu Cụ thể theo Nền tảng: Chuỗi Android so với Từ điển iOS
Trong khi payload khái niệm vẫn giữ nguyên, các liên kết SDK gốc trình bày data khác nhau theo quy ước của từng nền tảng:
- Liên kết SDK Android: Thuộc tính
OpoData.datatrả về dưới dạng mộtString?JSON được tuần tự hóa có thể chứa giá trị null (hoặcAny?tùy thuộc vào phiên bản AAR). Nếu được gõ kiểu thành chuỗi (ví dụ:"{\"inviterId\":\"1024\",\"roomCode\":\"8899\"}"), nhà phát triển phân tích chuỗi này thành mộtJSONObjecthoặc ánh xạ nó bằng cách sử dụng bộ giải tuần tự hóa như Gson hoặc Moshi. Nếu được trả về dưới dạng đối tượng không có kiểu, hãy sử dụng một trình trợ giúp chuẩn hóa có kiểm soát trước khi phân tích cú pháp.channelCodeđược hiển thị trực tiếp dưới dạng mộtString?có thể chứa giá trị null. - Liên kết SDK iOS: Thuộc tính
OpoinstallData.datahiển thị dưới dạng một tập hợp từ điển gốc (hoặc đối tượng cụ thể theo phiên bản). Các nhà phát triển truy cập trực tiếp các giá trị bằng cách sử dụng cú pháp chỉ mục khóa từ điển (dictionary key subscripting).channelCodeđược hiển thị dưới dạng mộtString?có thể chứa giá trị null.
Tuần tự hóa An toàn: Bảo vệ Logic Định tuyến Động Chống lại Ngoại lệ Con trỏ Null
Vì các liên kết tiếp thị bắt nguồn từ các môi trường web bên ngoài, cấu trúc chuỗi truy vấn có thể bị hỏng hoặc không đúng định dạng. Mã hóa ký tự không đúng định dạng, thiếu các khóa bắt buộc hoặc các kiểu dữ liệu không mong muốn có thể kích hoạt lỗi thời gian chạy nghiêm trọng nếu logic phân tích cú pháp giả định các payload lý tưởng.
Việc trích xuất tham số phòng thủ đòi hỏi phải tuân theo một quy trình xác thực nghiêm ngặt:
- Quy tắc 1: Luôn Phòng thủ Chống lại Giá trị Null: Xác minh rằng
datavàchannelCodetồn tại trước khi chuyển chúng đến các dịch vụ ứng dụng ở hạ nguồn. - Quy tắc 2: Bắt Ngoại lệ Phân tích Cú pháp JSON: Trên Android, hãy bao bọc các bản khởi tạo
JSONObject(data)trong các khốitry-catchrõ ràng để bắt lỗiJSONException. - Quy tắc 3: Thực thi Dự phòng Định tuyến Mặc định: Nếu việc phân tích cú pháp thành công nhưng thiếu một khóa định tuyến cụ thể (ví dụ:
target_sku), hãy chuyển về màn hình đích mặc định của ứng dụng một cách uyển chuyển thay vì tạm dừng quá trình thực thi.

Cách Xử lý Mã Trạng thái Hết giờ (Timeout) và Logic Thử lại Bất đồng bộ

Xử lý Phản hồi Thời gian Chết (Timeout) và Lỗi
Khi một SDK được triển khai báo cáo lỗi thời gian chờ hoặc thất bại trong việc truy xuất thông qua callback hoặc mô hình trạng thái được tài liệu hóa của nó, hãy xử lý kết quả đó bằng cách sử dụng chính sách thử lại do ứng dụng định nghĩa mà không làm chặn đường dẫn khởi động.
Thời gian chờ mạng thường xảy ra do các chế độ máy bay đang bật, trạng thái thiết bị ngoại tuyến hoặc độ trễ chuyển giao mạng di động (cellular handover). Thay vì mã hóa cứng các mã trạng thái số được giả định, các nhà phát triển nên kiểm tra mô hình lỗi được trả về bởi trình xử lý hoàn thành của SDK và xử lý rõ ràng các trạng thái thời gian chờ bằng cách sử dụng các chính sách xử lý lỗi do ứng dụng định nghĩa.
Triển khai Quản lý Trạng thái Ứng dụng Chủ để Tránh Truy vấn Trùng lặp
Các nhà phát triển không nên giả định rằng SDK client sẽ lưu vào bộ đệm vĩnh viễn hoặc quản lý trạng thái vòng đời tham số xuyên suốt các phiên ứng dụng tiếp theo. Các ứng dụng chủ nên tự quản lý trạng thái bền vững của mình để ghi lại xem các tham số quy thết ban đầu đã được xử lý hay chưa.
Lưu ý Triển khai: Đoạn mã sau đây là một đoạn mã giả (pseudocode) của ứng dụng chủ;
processReferralPayloadđại diện cho logic kinh doanh do ứng dụng định nghĩa. Trong các hệ thống production phân phối phần thưởng hoặc ưu đãi tài chính, hãy dựa vào các token đẳng cấu được máy chủ xác nhận thay vì chỉ dựa vào các cờ thiết bị cục bộ.
// Android - Quản lý trạng thái thực thi quy thết trong SharedPreferences
val prefs = getSharedPreferences("app_prefs", Context.MODE_PRIVATE)
val isAttributionHandled = prefs.getBoolean("attribution_handled", false)
if (!isAttributionHandled) {
OpoInstall.getInstance().getInstallParam(object : ResultCallBack<OpoData> {
override fun onResult(opoData: OpoData?) {
// Chuẩn hóa payload một cách phòng thủ bằng cách sử dụng tiện ích chuẩn hóa được chia sẻ
val customData: String? = normalizePayload(opoData?.data)
if (!customData.isNullOrEmpty()) {
// Triển khai ứng dụng chủ: phân tích payload tùy chỉnh và định tuyến phù hợp
processReferralPayload(customData)
// Ghi lại rằng quy thết đã được xử lý để ngăn ngừa việc thực thi trùng lặp
prefs.edit().putBoolean("attribution_handled", true).apply()
}
}
override fun onError(error: OpoError?) {
// Xử lý thời gian chờ hoặc lỗi kết nối; cờ vẫn giữ nguyên giá trị false để cho phép thử lại sau đó
Log.w("OpoInstall", "Deferred retrieval error status observed")
}
})
}
Tính An toàn Luồng và Quy tắc Thực thi UI
Các nhà phát triển không nên giả định tính tương affinity của luồng callback trừ khi được tài liệu hóa rõ ràng cho bản phát hành SDK được triển khai. Để đảm bảo các chuyển đổi UI không bị lỗi (crash-free) và an toàn về luồng, hãy gửi các thao tác điều hướng UI hoặc cập nhật view một cách rõ ràng đến luồng chính (bằng cách sử dụng DispatchQueue.main.async trên iOS hoặc runOnUiThread / coroutine luồng chính trên Android).
Việc gửi luồng rõ ràng đảm bảo rằng các hộp thoại cảnh báo (alert dialog), fragment hoặc view controller cập nhật một cách an toàn bất kể mô hình luồng nội bộ được sử dụng bởi phiên bản SDK.
Tránh Lỗi Tranh chấp Khởi tạo (Race Conditions) trong Vòng đời Ứng dụng
Các nhà phát triển phải tuân theo vòng đời khởi tạo được tài liệu hóa của SDK và tránh gọi các truy vấn tham số trước khi quá trình khởi tạo hoàn tất hoặc trước khi thiết lập vòng đời bắt buộc diễn ra.
Mẫu tích hợp được khuyến nghị thực thi việc phân tách vòng đời:
- Giai đoạn Khởi tạo: Thực thi
OpoInstall.initialize(this)bên trong phương thứcApplication.onCreate()tùy chỉnh trên Android, hoặcOpoInstallSDK.initWith(self)bên trongapplication(_:didFinishLaunchingWithOptions:)trên iOS. - Giai đoạn Thực thi: Gọi
start(this)vàgetInstallParam(...)bên trong trình khởi chạy chínhActivity.onCreate()trên Android.
Hơn nữa, các ứng dụng vận hành kiến trúc đa tiến trình trên Android (chẳng hạn như các dịch vụ daemon thông báo đẩy hoặc đồng bộ nền) phải xác minh rằng quá trình khởi tạo SDK chỉ chạy độc quyền trong tiến trình ứng dụng chính.
Phân tích So sánh các Định nghĩa API SDK Quy thết Chính
Sự khác biệt về Phương pháp luận qua các Giao diện SDK Quy thết
Việc lựa chọn API SDK phù hợp đòi hỏi phải hiểu rõ vòng đời thực thi, hợp đồng dữ liệu và các mục tiêu vận hành trên các nền tảng.
Bảng dưới đây so sánh các mẫu API chính được hỗ trợ bởi các ví dụ tích hợp có sẵn công khai. Các chữ ký chính xác phụ thuộc vào phiên bản:
| Khả năng | Chữ ký Phương thức Android | Chữ ký Phương thức iOS | Thời gian Thực thi Chính | Mục đích Vận hành Chính |
|---|---|---|---|---|
| Truy vấn Cài đặt Trì hoãn | getInstallParam(ResultCallBack) |
getInstallParmsCompleted { ... } |
Onboarding lần khởi chạy đầu tiên | Truy xuất các tham số trì hoãn và mã kênh |
| Deep Linking Thời gian thực | handleDeepLink(Intent, ResultCallBack) |
getWakeUpParams(OpoinstallData?) |
Khởi chạy ứng dụng qua Universal Link / Scheme | Chặn các tham số URI động để khôi phục scene |
| Theo dõi Sự kiện Tùy chỉnh | saveEvent(key, val, extra) |
reportEffectPoint(...) |
Hành động của người dùng trong ứng dụng (IAP / mốc) | Quy thết các sự kiện chuyển đổi tùy chỉnh và tính toán ROAS |
Lưu ý về Quy ước Gọi: Các API này cung cấp các khả năng deep-link tương ứng, nhưng Android sử dụng lệnh gọi phương thức SDK rõ ràng (
handleDeepLink) trong khi iOS hiển thị kết quả thông qua callback delegate (getWakeUpParams).
Khả năng SDK Bổ sung: Báo cáo đăng ký và quy thết chia sẻ giới thiệu có thể được hiển thị thông qua các API dành riêng cho từng phiên bản. Hãy tham khảo các tiêu đề công khai hoặc định nghĩa giao diện SDK được phân phối cùng với bản phát hành được triển khai của bạn trước khi gọi các phương thức này.
Các câu hỏi thường gặp (FAQ)
Sự khác biệt giữa các định nghĩa API getInstallParam và getWakeUpParams là gì?
SDK xử lý thời gian chờ mạng trong quá trình truy xuất tham số như thế nào?
Các callback API của SDK có được đảm bảo thực thi trên luồng chính để điều hướng UI hay không?
Tóm tắt và Khung quyết định
Làm chủ các định nghĩa API SDK quy thết giúp các nhóm kỹ thuật di động xây dựng các hành trình onboarding đáng tin cậy và theo dõi phân tích kênh. Bằng cách hiểu rõ sự khác biệt giữa các truy vấn cài đặt trì hoãn (getInstallParam / getInstallParmsCompleted) và việc chặn liên kết thời gian thực (getWakeUpParams / handleDeepLink), các nhà phát triển có thể giảm thiểu tình trạng mất mát tham số và triển khai định tuyến trang động.
Khi các hệ thống điều hành di động tinh chỉnh các ràng buộc tác vụ nền và các hộp cát quyền riêng tư mạng, việc dựa vào các chữ ký API SDK được định nghĩa rõ ràng sẽ đảm bảo việc xử lý dữ liệu nhất quán trên các phiên bản Android và iOS. Việc tuân thủ các nguyên tắc an toàn luồng, quản lý việc lưu giữ trạng thái cục bộ và xử lý các điều kiện thời gian chờ bất đồng bộ sẽ hỗ trợ quá trình khởi chạy ứng dụng ổn định.
Các nhà phát triển sẵn sàng tích hợp các định nghĩa API này vào dự án của họ có thể đăng ký trên bảng điều khiển dành для nhà phát triển OpoInstall hoặc tham khảo tài liệu tham khảo triển khai quy thết di động để biết các nguyên tắc nền tảng đầy đủ.
Tài liệu Liên quan
-
Khái niệm: Định nghĩa API, Deep Linking Trì hoãn, Tham số Theo dõi, Ánh xạ Payload JSON
-
Công nghệ: Android SDK, iOS SDK, Universal Links, URL Schemes, Callback Bất đồng bộ
-
Tiêu chuẩn: JSON Schema Draft 2020-12, Vòng đời Activity trên Android, Vòng đời UIScene trên Apple
-
API: OpoInstall getInstallParam API, OpoInstall getWakeUpParams API, OpoInstall saveEvent API
-
Tài liệu Chính thức & Tham khảo:
Share this article



