Thứ tự gọi trong Kotlin Multiplatform SDK

Adapty.activate() phải hoàn thành trước khi bạn gọi bất kỳ phương thức Adapty SDK nào khác. Cho đến khi nó hoàn tất, SDK chưa có trạng thái. Bất kỳ lệnh gọi nào được thực hiện trước hoặc song song với activate() đều sẽ thất bại với lỗi kích hoạt. Xem Xử lý lỗi trong Kotlin Multiplatform SDK.

Nếu ứng dụng của bạn xác thực người dùng và bạn thu thập customer user ID sau khi khởi chạy, hãy gọi Adapty.identify() ngay tại thời điểm đó. Đừng gọi các phương thức liên quan đến hành động người dùng cho đến khi identify hoàn tất. Các lệnh gọi chạy đồng thời với nó có thể trả về lỗi, hoặc sẽ tác động lên hồ sơ người dùng ẩn danh được tạo khi kích hoạt. Khi điều này xảy ra, attribution, MMP ID như appsflyer_id, và quyền sở hữu cài đặt không phải lúc nào cũng được chuyển sang hồ sơ người dùng đã xác thực. Nếu ứng dụng của bạn không xác thực người dùng, hãy bỏ qua identify và tiếp tục làm việc với hồ sơ người dùng ẩn danh.

Các SDK MMP và analytics (AppsFlyer, Adjust, Branch, PostHog) tuân theo quy tắc tương tự. Hãy khởi tạo chúng trước và chờ callback UID của chúng trước khi gọi Adapty.activate. Nếu không, MMP ID sẽ được gắn vào một hồ sơ ẩn danh tạm thời và không phải lúc nào cũng được chuyển sang hồ sơ đã xác định. Để biết chi tiết về AppsFlyer, xem AppsFlyer.

Thứ tự thực hiện đúng

Lộ trình của bạn phụ thuộc vào hai yếu tố: thời điểm bạn biết customer user ID, và liệu bạn có sử dụng MMP hoặc analytics SDK hay không.

  • Bước 2 và 5: Bắt buộc với mọi ứng dụng. Kích hoạt SDK, sau đó gọi các phương thức SDK.
  • Bước 1 và 3: Chỉ cần thiết nếu bạn tích hợp MMP hoặc analytics SDK (AppsFlyer, Adjust, Branch, PostHog).
  • Bước 4: Chỉ cần thiết nếu ứng dụng của bạn xác thực người dùng và thu thập customer user ID sau khi khởi chạy.

Nếu bạn đã có customer user ID ngay khi khởi động ứng dụng, hãy truyền nó vào AdaptyConfig.Builder trước khi gọi activate() (bước 2a). Cách này sẽ không bao giờ tạo hồ sơ người dùng ẩn danh, do đó bước 4 là không cần thiết.

BướcLệnh gọiKhi nàoGhi chú
1Khởi tạo MMP hoặc analytics SDK (AppsFlyer, Adjust, PostHog, Branch)Khi khởi động ứng dụng, thực hiện đầu tiênChờ callback UID từ MMP, ví dụ getAppsFlyerUID.
2aAdapty.activate(configuration = AdaptyConfig.Builder("KEY").withCustomerUserId(...).build())Khi khởi động ứng dụng, sau bước 1, nếu bạn đã có customer user IDKhuyến nghị. Sẽ không tạo hồ sơ người dùng ẩn danh.
2bAdapty.activate(configuration = AdaptyConfig.Builder("KEY").build()) không có withCustomerUserIdKhi khởi động ứng dụng, sau bước 1, nếu bạn chưa có customer user ID (hoặc không thu thập)Adapty sẽ tạo hồ sơ người dùng ẩn danh.
3Adapty.setIntegrationIdentifier("appsflyer_id", uid) cho từng MMPSau bước 2, trước bất kỳ lệnh gọi nào liên quan đến người dùngBắt buộc để MMP ID được gắn vào đúng hồ sơ người dùng.
4Adapty.identify("YOUR_USER_ID").onSuccess { ... }.onError { ... }Sau bước 3 (hoặc bước 2 nếu không có MMP), trước bước 5 — chỉ áp dụng cho luồng 2b có xác thựcChờ onSuccess trước bất kỳ lệnh gọi nào liên quan đến người dùng. Các lệnh gọi đồng thời trong lúc identify có thể gắn vào hồ sơ người dùng ẩn danh.
5getPaywall (getFlow trong SDK v4), getPaywallProducts, restorePurchases, makePurchase, updateAttribution, updateProfileSau bước 4 nếu bạn gọi identify; ngược lại sau bước 3 (hoặc bước 2 nếu không có MMP)Các lệnh gọi này cần một hồ sơ người dùng ổn định.

Bỏ qua các bước này sẽ khiến người dùng cũ mất quyền truy cập premium, thiếu appsflyer_id trên hồ sơ người dùng, và paywall trả về sai đối tượng.

Cài đặt từ web2app và web funnel

Nếu người dùng mua hàng qua web checkout (Stripe, Paddle) và sau đó cài đặt ứng dụng native, lần đầu tiên activate() trên thiết bị sẽ tạo một hồ sơ người dùng ẩn danh mới. Hồ sơ người dùng này không được liên kết với hồ sơ người dùng web. Nếu bạn có thể xác định customer user ID trước khi khởi chạy ứng dụng (từ luồng xác thực hoặc install referrer), hãy truyền trực tiếp vào AdaptyConfig.Builder. Nếu không, lần mua hàng trên web sẽ không hiển thị trên thiết bị cho đến khi bạn gọi identify("YOUR_USER_ID") và sau đó gọi restorePurchases.

Để biết metadata cần gửi với mỗi web checkout, xem: