---
title: "Unity SDK 中的调用顺序"
description: "通过按照正确顺序调用 Adapty SDK 方法，避免付费权限丢失、归因缺失以及偶发的 #2002 错误。"
---

`Adapty.Activate()` 必须在调用任何其他 Adapty SDK 方法之前完成。在其完成回调触发之前，SDK 没有任何状态。在 `Activate()` 之前或与其并行发起的任何调用都会失败，并返回 [`#2002 notActivated`](unity-handle-errors#custom-network-codes) 错误。
如果你的应用需要对用户进行身份验证，并且在启动后才能获取到 customer user ID，请在获取到该 ID 时调用 `Adapty.Identify()`。在 `Identify` 回调触发之前，不要调用任何用户操作相关的方法。与该调用产生竞争的请求，要么会以 [`#3006 profileWasChanged`](unity-handle-errors#custom-network-codes) 错误失败，要么会落到激活时创建的匿名用户画像上。一旦发生这种情况，归因数据、`appsflyer_id` 等 MMP ID 以及安装归属并不总能转移到已识别的用户画像上。如果你的应用不需要用户身份验证，则跳过 `Identify`，继续使用匿名用户画像即可。
MMP 和分析类 SDK（AppsFlyer、Adjust、Branch、PostHog）遵循同样的规则。请先初始化它们，等待其 UID 回调后再调用 `Adapty.Activate`。否则 MMP ID 会绑定到一个短暂的匿名用户画像上，不一定能迁移到已识别的用户画像。关于 AppsFlyer 的具体说明，请参阅 [AppsFlyer](appsflyer)。
## 正确的操作顺序 \{#the-correct-order\}

你的操作路径取决于两件事：何时获取到 customer user ID，以及是否使用了 MMP 或数据分析 SDK。

- **步骤 2 和 5**：所有应用必须完成。初始化 SDK，然后调用 SDK 方法。
- **步骤 1 和 3**：仅在集成 MMP 或数据分析 SDK（AppsFlyer、Adjust、Branch、PostHog）时需要。
- **步骤 4**：仅在应用需要用户登录、且在启动后才能获取 customer user ID 时需要。
如果在应用启动时已知客户用户 ID，可直接在 `Activate()` 中传入（步骤 2a）。这条路径不会创建匿名用户画像，因此步骤 4 无需执行。
| 步骤 | 调用 | 时机 | 说明 |
|------|---------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|
| 1    | 初始化 MMP 或分析 SDK（AppsFlyer、Adjust、PostHog、Branch）                                     | 应用启动，最先执行                                                                      | 等待 MMP 的 UID 回调，例如 `getAppsFlyerId`。                                 |
| 2a   | `Adapty.Activate(builder.Build(), ...)` 并在 builder 上设置 `SetCustomerUserId`                           | 应用启动，步骤 1 之后，如果已有 customer user ID                             | 推荐方式，不会创建匿名用户画像。                                             |
| 2b   | `Adapty.Activate(builder.Build(), ...)` 不设置 `SetCustomerUserId`                                           | 应用启动，步骤 1 之后，如果没有 customer user ID（或从不收集） | Adapty 会创建一个匿名用户画像。                                                           |
| 3    | 为每个 MMP 调用 `Adapty.SetIntegrationIdentifier(key, value, callback)`                                          | 步骤 2 之后，任何用户操作调用之前                              | 必须执行，确保 MMP ID 关联到正确的用户画像。                                               |
| 4    | `Adapty.Identify("YOUR_USER_ID", callback)`                                                                   | 步骤 3 之后（若无 MMP 则在步骤 2 之后），步骤 5 之前——仅适用于路径 2b 且需要身份验证时 | 等待完成回调。在 `Identify` 执行期间并发调用会产生 `#3006 profileWasChanged` 错误。 |
| 5    | `GetPaywall`、`GetPaywallProducts`、`RestorePurchases`、`MakePurchase`、`UpdateAttribution`、`UpdateProfile`  | 如果调用了 `Identify`，则在步骤 4 之后；否则在步骤 3 之后（若无 MMP 则在步骤 2 之后）      | 这些调用需要一个稳定的用户画像。                                                             |
:::important
跳过这些步骤会导致回访用户失去高级访问权限、用户画像缺少 `appsflyer_id`，以及付费墙按错误的目标受众返回。
:::
## Web2app 与网页漏斗安装 \{#web2app-and-web-funnel-installs\}

如果用户在网页端（Stripe、Paddle）完成购买后再安装原生应用，设备首次调用 `Activate()` 时会创建一个新的匿名用户画像，该画像不会与网页端的用户画像关联。如果能在应用启动前（通过登录流程或安装来源追踪）拿到客户用户 ID，请直接传入 `Activate()`；否则，网页端的购买记录在设备上将不可见，直到你调用 `Identify("YOUR_USER_ID")` 再调用 `RestorePurchases` 才能同步。

关于每次网页端结账时需要传入的元数据，请参阅：

- [Stripe](stripe)
- [Paddle](paddle)