Kotlin Multiplatform SDK 中的调用顺序

Adapty.activate() 必须在调用任何其他 Adapty SDK 方法之前完成。在其完成之前,SDK 没有任何状态。在 activate() 之前或与其并行发出的任何调用都会以激活错误失败。详见 在 Kotlin Multiplatform SDK 中处理错误。 如果你的应用需要用户认证,并在启动后才能获取到 customer user ID,请在获取到 ID 后调用 Adapty.identify()。在 identify 完成之前,不要调用任何用户操作相关的方法。与 identify 并发执行的调用要么会返回错误,要么会落在激活时创建的匿名用户画像上。一旦发生这种情况,归因数据、appsflyer_id 等 MMP ID 以及安装归属关系,不一定能转移到已识别的用户画像上。如果你的应用不需要用户认证,则无需调用 identify,直接使用匿名用户画像即可。 MMP 和分析 SDK(AppsFlyer、Adjust、Branch、PostHog)遵循同样的规则。请先初始化它们,等待其 UID 回调后再调用 Adapty.activate。否则 MMP ID 会落在一个临时匿名用户画像上,且不一定会转移到已识别的用户画像上。有关 AppsFlyer 的具体说明,请参阅 AppsFlyer

正确的操作顺序

您的操作路径取决于两个因素:您何时获得用户 ID,以及是否使用了 MMP 或分析 SDK。

  • 步骤 2 和 5:每个应用都必须完成。先激活 SDK,再调用 SDK 方法。
  • 步骤 1 和 3:仅在集成了 MMP 或分析 SDK(AppsFlyer、Adjust、Branch、PostHog)时才需要。
  • 步骤 4:仅在应用需要用户身份验证,且在启动后才能获取用户 ID 时才需要。 如果在应用启动时就已知客户用户 ID,请在调用 activate() 之前将其传入 AdaptyConfig.Builder(步骤 2a)。这种方式不会创建匿名用户画像,因此无需执行步骤 4。 | 步骤 | 调用 | 时机 | 说明 | |------|---------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| | 1 | 初始化您的 MMP 或分析 SDK(AppsFlyer、Adjust、PostHog、Branch) | 应用启动时,最先执行 | 等待 MMP 的 UID 回调,例如 getAppsFlyerUID。 | | 2a | Adapty.activate(configuration = AdaptyConfig.Builder("KEY").withCustomerUserId(...).build()) | 应用启动时,在步骤 1 之后执行,前提是您已有 customer user ID | 推荐方式。不会创建任何匿名用户画像。 | | 2b | Adapty.activate(configuration = AdaptyConfig.Builder("KEY").build()) 不带 withCustomerUserId | 应用启动时,在步骤 1 之后执行,前提是您尚未获取 customer user ID(或从不收集) | Adapty 会创建匿名用户画像。 | | 3 | 为每个 MMP 调用 Adapty.setIntegrationIdentifier("appsflyer_id", uid) | 在步骤 2 之后、任何用户操作调用之前 | 必须执行,以确保 MMP ID 关联到正确的用户画像。 | | 4 | Adapty.identify("YOUR_USER_ID").onSuccess { ... }.onError { ... } | 在步骤 3 之后(若无 MMP 则在步骤 2 之后)、步骤 5 之前 — 仅适用于走路径 2b 且需要身份验证的场景 | 需等待 onSuccess 回调后再执行任何用户操作调用。在 identify 执行期间并发调用可能会落到匿名用户画像上。 | | 5 | getPaywallgetPaywallProductsrestorePurchasesmakePurchaseupdateAttributionupdateProfile | 若调用了 identify,则在步骤 4 之后;否则在步骤 3 之后(若无 MMP 则在步骤 2 之后) | 这些调用需要一个稳定的用户画像。 |

跳过这些步骤会导致回归用户无法恢复高级权限、用户画像中缺少 appsflyer_id,以及付费墙针对错误的目标受众展示。

Web2app 与 Web 漏斗安装

如果用户在 Web 结账页面(Stripe、Paddle)完成购买后才安装原生应用,设备首次调用 activate() 时会创建一个全新的匿名用户画像,该画像不会自动与 Web 端的用户画像关联。如果你能在应用启动前(通过认证流程或安装来源引用)获取到用户 ID,可直接将其传入 AdaptyConfig.Builder。否则,在你调用 identify("YOUR_USER_ID") 并执行 restorePurchases 之前,设备上将无法看到该 Web 端购买记录。

关于每次 Web 结账时需要传递的元数据,请参考: