Khắc Phục Sự Cố Deep Link
Bạn sẽ học: Cách tự chẩn đoán khi tích hợp không như mong đợi — bắt đầu từ triệu chứng bạn quan sát được, rồi dùng
matchMethod / missReason trong response làm la bàn. Hầu hết sự cố tự gỡ được mà không cần mở ticket.Công cụ chẩn đoán số 1: đọc response
Trước khi đoán, hãy in nguyên response của/track/open ra log và đọc ba trường:
Đặt kỳ vọng đúng: deferred là best-effort
Chẩn đoán theo triệu chứng
App không mở (vẫn ra trình duyệt) — luồng immediate
iOS: chạm link nhưng Safari mở thay vì app
iOS: chạm link nhưng Safari mở thay vì app
Thứ tự kiểm tra:
- AASA đã live chưa:
curl -s https://your-domain.com/.well-known/apple-app-site-association | jq— phải thấyappIDđúng dạng<TeamID>.<BundleID>. - Entitlement: file
.entitlementscóapplinks:your-domain.comđúng domain. - Cache Apple CDN ~6h: Apple cache AASA ~6 giờ bất kể
max-age. Sau khi sửa cấu hình, gỡ app và cài lại để buộc tải AASA mới. Xem Cấu Hình Domain.
Android: hộp chọn ứng dụng hiện ra thay vì mở thẳng app
Android: hộp chọn ứng dụng hiện ra thay vì mở thẳng app
Thiếu xác minh App Link. Kiểm tra:
- Nếu thấy
1024(chưa xác minh): SHA-256 trong dashboard không khớp chứng chỉ ký APK đang cài (debug vs release khác nhau — thêm cả hai). - Thiếu
android:autoVerify="true"trong intent-filter. - Buộc xác minh lại:
adb shell pm verify-app-links --re-verify your.package.name. assetlinks.jsoncó thể bị cache; xem Cấu Hình Domain.
Mọi lời gọi /track/open trả 401
401 Unauthenticated trên mọi request
401 Unauthenticated trên mọi request
Đây là lỗi phổ biến nhất. Gần như luôn là sai loại key:
- Dùng publishable key
li2_pk_...(Settings → Analytics → Publishable Key), không dùng server API keyX-Li2-API-Key. Endpoint mobile chỉ chấp nhậnli2_pk_*. - Android: thiếu
LI2_PUBLISHABLE_KEYtronglocal.properties→BuildConfig.LI2_PUBLISHABLE_KEYrỗng → header rỗng → 401. Thêm key rồi build lại. - Lỗi xác thực ở middleware không kèm
error_code— branch theo HTTP status 401, đừng so khớp chuỗi message. Xem API: body lỗi.
Deferred không khôi phục được (link == null) — đọc missReason
missReason | Bình thường hay cần sửa? | Ý nghĩa & hành động |
|---|---|---|
no_candidate | Thường bình thường | Không tìm thấy click khớp: người dùng không tới store qua chính link Li2, hoặc bản ghi Redis đã hết hạn (TTL). Chỉ cần lo nếu mọi lượt deferred đều no_candidate → kiểm tra trang trung gian có thực sự gieo li2_cid (iOS) / li2_dl (Android) không. |
clipboard_empty | Bình thường (iOS) | Người dùng chạm Paste nhưng clipboard không chứa link Li2. Không sửa được từ phía app. |
clipboard_denied | Bình thường (iOS) | Người dùng chặn quyền dán. Trên iOS 16+ dùng Li2PasteButton để tránh alert; iOS 15 không tránh được. |
opt_out | Bình thường | Người dùng chủ động bấm “Bỏ qua”. Hành vi đúng. |
cross_tenant_blocked | Cần xem lại | Hostname thuộc org khác — bị chặn theo cô lập tenant. Kiểm tra li2Domains / deepLinkDomains bạn gửi có đúng là domain của org bạn không. |
Cô lập tenant ở luồng deferred trả
200 + cross_tenant_blocked, KHÔNG phải 403 — để không lộ việc hostname có thuộc org khác hay không. Chỉ luồng immediate mới trả 403 khi domain không thuộc org. Xem API.iOS: Li2PasteButton luôn xám / disabled
Nút Paste không bấm được
Nút Paste không bấm được
- Clipboard đang rỗng → đây là behavior đúng của
Li2PasteButton. Bạn phải có nút thay thế cho nhánhclipboardHasContent == false(gọisubmitPasteControlEmpty()), nếu không người dùng bị kẹt và outcomeemptykhông bao giờ được gửi. Xem ConsentSheet trong Tích hợp App. - Tự dựng UIPasteControl trong
fullScreenCoverbị xám: phải gáncontrol.targettường minh + overridecanPaste(_:). Đây là lý do nên dùngLi2PasteButtoncủa SDK thay vì tự bọc.
iOS: màn hình đồng ý hiện lại sau khi Universal Link đã mở app
Sheet đồng ý xuất hiện rồi tự biến mất
Sheet đồng ý xuất hiện rồi tự biến mất
Bình thường nếu Universal Link tới trong cửa sổ grace (~250ms). UL “thắng”: cờ
hasReceivedUniversalLink được bật, nhánh deferred bị bỏ qua, và sheet tự dismiss. Không cần sửa.Android: deferred luôn no_candidate dù cài qua Play Store
Install Referrer không trả li2_dl
Install Referrer không trả li2_dl
adb installAPK cục bộ KHÔNG có referrer. Install Referrer chỉ trả chuỗi thật khi cài qua Play Store (internal-test track). Đây là giới hạn nền tảng, không phải bug.- Người dùng phải tới Play Store qua chính link Li2 (URL mang tham số referrer). Tự tìm app trên store → không có
li2_dl→no_candidate. - App phải gọi
InstallReferrerClientở lần mở đầu. Truy vấn một lần rồi lưu kết quả — đừng phụ thuộc gọi lại nhiều lần. - Không có cửa sổ “mở ngay kẻo mất”: Play lưu referrer lúc cài và giữ lại; bạn lấy được ở lần mở đầu dù mở bằng cách nào.
Conversion: lead/sale báo lỗi
| Lỗi | Nguyên nhân / cách sửa |
|---|---|
.noClickIdAvailable (iOS) | Gọi attributed/anonymous khi chưa có match. Chạy deep-link match trước, hoặc dùng biến Direct. |
.missingExternalId (iOS) | identify thiếu external_id. Cấp user id ổn định. |
403 | Gói/feature conversion chưa bật cho org hoặc link. |
400 (customer not found) | Cấp email/name/phone để tự tạo khách hàng, hoặc ghi lead trước sale. |
| Lead & sale rơi vào hai hồ sơ | Thiếu identify (iOS) / lead __identify__ (HTTP) trước sale. Xem Đo Lường Chuyển Đổi. |
Cây quyết định nhanh
Khi nào cần mở ticket
Tự gỡ được hầu hết bằng các bước trên. Mở ticket tới [email protected] khi:- AASA/assetlinks báo “Live & correct” trên dashboard nhưng device vẫn không xác minh sau khi đã chờ qua cache (~6h iOS).
/track/opentrả 5xx lặp lại (lỗi server — kèm timestamp + response body).matchMethod/missReasontrả giá trị không có trong tài liệu.
Bước tiếp theo
API: POST /track/open
Tra cứu đầy đủ matchMethod, missReason, mã trạng thái và body lỗi.
Cấu Hình Domain
Kiểm tra file AASA / assetlinks và vấn đề caching.

