Thứ tự gọi hàm trong Flutter SDK
Adapty().activate() phải hoàn thành trước khi bạn gọi bất kỳ phương thức nào khác của Adapty SDK. Cho đến khi hàm này trả về kết quả, SDK chưa có trạng thái. Mọi lệnh gọi trước hoặc song song với activate() sẽ thất bại với lỗi #2002 notActivated.
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() 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 trả về kết quả. Các lệnh gọi chạy đua với nó sẽ thất bại với #3006 profileWasChanged, hoặc rơi vào hồ sơ người dùng ẩn danh được tạo lúc kích hoạt. Khi điều này xảy ra, attribution, MMP ID như appsflyer_id, và thông tin sở hữu cài đặt không phải lúc nào cũng được chuyển sang hồ sơ đã xác định. Nếu ứng dụng 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ơ ẩn danh.
Các SDK MMP và analytics (AppsFlyer, Adjust, Branch, PostHog) áp dụng 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ẽ 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. Về các lưu ý riêng của AppsFlyer, xem AppsFlyer.
Thứ tự đúng
Hướng đi của bạn phụ thuộc vào hai điều: thời điểm bạn biết customer user ID và việc bạn có sử dụng SDK MMP hoặc analytics 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ỉ bắt buộc nếu bạn tích hợp SDK MMP hoặc analytics (AppsFlyer, Adjust, Branch, PostHog).
- Bước 4: Chỉ bắt buộc nếu ứng dụng 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 lúc khởi chạy ứng dụng, hãy truyền trực tiếp vào activate() (bước 2a). Hướng này không bao giờ tạo hồ sơ ẩn danh, vì vậy bước 4 là không cần thiết.
| Bước | Lệnh gọi | Thời điểm | Ghi chú |
|---|---|---|---|
| 1 | Khởi tạo SDK MMP hoặc analytics của bạn (AppsFlyer, Adjust, PostHog, Branch) | Khởi chạy ứng dụng, đầu tiên | Chờ callback UID của MMP, ví dụ getAppsFlyerUID. |
| 2a | Adapty().activate(configuration: ...) với withCustomerUserId được thiết lập trong configuration | Khởi chạy ứng dụng, sau bước 1, nếu bạn đã có customer user ID | Được khuyến nghị. Không bao giờ tạo hồ sơ ẩn danh. |
| 2b | Adapty().activate(configuration: ...) không có withCustomerUserId | Khởi chạy ứ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 tạo một hồ sơ ẩn danh. |
| 3 | Adapty().setIntegrationIdentifier(key: ..., value: ...) cho từng MMP | Sau bước 2, trước mọi lệnh gọi liên quan đến hành động người dùng | Bắt buộc để MMP ID gắn vào đúng hồ sơ. |
| 4 | await Adapty().identify(customerUserId) | Sau bước 3 (hoặc bước 2 nếu không có MMP), trước bước 5 — chỉ trên hướng 2b có xác thực | Luôn dùng await. Các lệnh gọi đồng thời trong lúc identify sẽ tạo ra #3006 profileWasChanged. |
| 5 | getPaywall, getPaywallProducts, restorePurchases, makePurchase, updateAttribution, updateProfile | Sau bước 4 nếu bạn gọi identify; nếu không thì 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ơ ổn định. |
Bỏ qua các bước này sẽ gây ra mất quyền truy cập premium cho người dùng cũ, thiếu appsflyer_id trên hồ sơ, và paywall được trả về cho sai đối tượng.
Cài đặ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 activate() đầu tiên trên thiết bị sẽ tạo một hồ sơ ẩn danh mới. Hồ sơ này không được liên kết với hồ sơ 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 activate(). Nếu không, giao dịch mua 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.
Về metadata cần gửi kèm mỗi web checkout, xem: