---
title: "添加不含付费墙的 A/B 测试实验变体"
description: "运行一个 A/B 测试，其中一个实验变体跳过付费墙，通过远程配置标志来控制是否显示付费墙。"
---

你可以通过运行一个含空白实验变体的 A/B 测试来衡量付费墙的实际效果。一个实验变体展示付费墙，另一个什么都不展示。你的应用从付费墙的远程配置中读取一个标志，以决定是否渲染付费墙。
## 工作原理 \{#how-it-works\}

该方案在同一个版位中使用两个付费墙：

- **付费墙 A**：你想要测试的付费墙，其远程配置中的 `show_paywall` 设置为 `true`。
- **付费墙 B**：一个空付费墙，其远程配置中的 `show_paywall` 设置为 `false`。

当 `getPaywall` 返回一个付费墙时，你的应用会读取 `show_paywall` 标志。如果该标志为 `true`，应用就渲染付费墙；如果为 `false`，应用则跳过渲染，用户无需经过付费墙即可继续使用。
## 1. 在远程配置中添加 show_paywall 标志 \{#1-add-the-show_paywall-flag-in-remote-config\}

你需要在同一个版位中配置两个付费墙：付费墙 A（你想测试的那个）和付费墙 B（一个空付费墙）。为每个付费墙添加一个 `show_paywall` 字段，这样你的应用就可以通过同一个键对两个实验变体分别做判断。

为付费墙 A 添加该标志的方法：
1. 在 Adapty 主菜单中打开 [**Paywalls**](https://app.adapty.io/paywalls) 部分，选择付费墙 A。
2. 切换到 **Remote config** 标签页。
3. 在 **Table** 视图中，点击 **Add row**，创建一个名称为 `show_paywall`、值为 `true` 的字段。在 **JSON** 视图中，该条目如下所示：

   ```json showLineNumbers
   {
     "show_paywall": true
   }
   ```

4. 保存更改。

对付费墙 B 重复相同步骤，但将 `show_paywall` 设置为 `false`。

有关远程配置的完整详情，请参阅[使用远程配置设计付费墙](customize-paywall-with-remote-config)。
:::tip
在两个实验变体上都设置 `show_paywall`，可以让两组的代码路径保持一致，也方便后续添加更多实验变体。
:::
## 2. 设置 A/B 测试 \{#2-set-up-the-ab-test\}

1. 在版位上[创建 A/B 测试](run_stop_ab_tests)，并将两个付费墙添加为实验变体。
2. 设置实验变体权重，以便在看到付费墙和未看到付费墙的用户之间分配流量。
## 3. 在应用中检查标志 \{#check-the-flag-in-your-app\}

从 `getPaywall` 返回的付费墙远程配置中读取 `show_paywall`。如果该标志为 `false`，则跳过渲染，让用户继续操作。

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS" default>

```swift showLineNumbers
do {
    let paywall = try await Adapty.getPaywall(placementId: "YOUR_PLACEMENT_ID")
    let showPaywall = paywall.remoteConfig?.dictionary?["show_paywall"] as? Bool ?? true

    if showPaywall {
        // Render the paywall
    }
} catch {
    // handle the error
}
```

</TabItem>
<TabItem value="kotlin" label="Android">

```kotlin showLineNumbers
Adapty.getPaywall("YOUR_PLACEMENT_ID") { result ->
    when (result) {
        is AdaptyResult.Success -> {
            val paywall = result.value
            val showPaywall = paywall.remoteConfig?.dataMap?.get("show_paywall") as? Boolean ?: true

            if (showPaywall) {
                // Render the paywall
            }
        }
        is AdaptyResult.Error -> {
            // handle the error
        }
    }
}
```

</TabItem>

<TabItem value="react-native" label="React Native">
```typescript showLineNumbers
try {
  const paywall = await adapty.getPaywall({ placementId: "YOUR_PLACEMENT_ID" });
  const showPaywall = paywall.remoteConfig?.data?.["show_paywall"] ?? true;

  if (showPaywall) {
    // Render the paywall
  }
} catch (error) {
  // handle the error
}
```

</TabItem>

<TabItem value="flutter" label="Flutter">
```dart showLineNumbers
try {
  final paywall = await Adapty().getPaywall(id: "YOUR_PLACEMENT_ID");
  final bool showPaywall = paywall.remoteConfig?.dictionary?['show_paywall'] as bool? ?? true;

  if (showPaywall) {
    // Render the paywall
  }
} on AdaptyError catch (adaptyError) {
  // handle the error
}
```

</TabItem>

<TabItem value="unity" label="Unity">
```csharp showLineNumbers
Adapty.GetPaywall("YOUR_PLACEMENT_ID", (paywall, error) => {
    if (error != null) {
        // handle the error
        return;
    }

    var showPaywall = paywall.RemoteConfig?.Dictionary?["show_paywall"] as bool? ?? true;

    if (showPaywall) {
        // Render the paywall
    }
});
```

</TabItem>

<TabItem value="kmp" label="Kotlin Multiplatform">
```kotlin showLineNumbers
Adapty.getPaywall(
    placementId = "YOUR_PLACEMENT_ID"
).onSuccess { paywall ->
    val showPaywall = paywall.remoteConfig?.dataMap?.get("show_paywall") as? Boolean ?: true

    if (showPaywall) {
        // Render the paywall
    }
}.onError { error ->
    // handle the error
}
```

</TabItem>

<TabItem value="capacitor" label="Capacitor">
```typescript showLineNumbers

try {
  const paywall = await adapty.getPaywall({ placementId: 'YOUR_PLACEMENT_ID' });
  const showPaywall = paywall.remoteConfig?.data?.['show_paywall'] ?? true;

  if (showPaywall) {
    // Render the paywall
  }
} catch (error) {
  // handle the error
}
```

</TabItem>
</Tabs>

当标志缺失时，默认值 `true` 会保持付费墙可见，因此未设置该标志的现有付费墙不受影响。
:::important
如果您自行渲染付费墙（未使用[付费墙编辑工具](adapty-paywall-builder)），请在展示付费墙 A 时调用 [`logShowPaywall`](present-remote-config-paywalls#track-paywall-view-events)。否则，Adapty 无法在测试中统计付费墙的展示次数。付费墙 B 从未展示给用户，因此无需记录其展示事件。
:::
## 下一步 \{#next-steps\}

- [创建、运行和停止 A/B 测试](run_stop_ab_tests) — 设置包含两个实验变体的测试
- [A/B 测试结果与数据图表](results-and-metrics) — 将无付费墙实验变体与你的付费墙进行对比