---
title: "在 iOS SDK 的自定义付费墙中启用购买功能"
description: "将 Adapty SDK 集成到自定义 iOS 付费墙中，以启用应用内购买功能。"
---

本指南介绍如何将 Adapty 集成到自定义付费墙中。你可以完全掌控付费墙的实现方式，同时由 Adapty SDK 负责获取产品、处理新购买以及恢复历史购买记录。
:::important
**本指南面向实现自定义付费墙的开发者。** 如果你想以最简单的方式开通购买功能，请使用 [Adapty Flow Builder](ios-quickstart-paywalls)。使用 Flow Builder，你可以在无代码可视化编辑器中创建流程，Adapty 自动处理所有购买逻辑，并且无需重新发布应用即可测试不同设计。
:::
## 开始之前 \{#before-you-start\}

### 设置产品 \{#set-up-products\}

要启用应用内购买，你需要了解三个核心概念：
- [**产品**](product) – 用户可以购买的任何内容（订阅、消耗型商品、永久授权）
- [**付费墙**](paywalls) – 定义向用户展示哪些产品的配置。在 Adapty 中，付费墙是获取产品的唯一方式，这种设计让你无需修改代码即可调整产品、价格和优惠。
- [**版位**](placements) – 在应用中展示付费墙的位置和时机（例如 `main`、`onboarding`、`settings`）。你在看板中为版位配置付费墙，然后在代码中通过版位 ID 请求。这让 A/B 测试和向不同用户展示不同付费墙变得非常简单。
即使你使用自定义付费墙，也需要了解这些概念。简单来说，它们就是你管理应用内销售产品的方式。

要实现自定义付费墙，你需要创建一个**付费墙**并将其添加到**版位**中。这样你才能获取产品信息。如需了解在看板中的具体操作步骤，请参考[快速入门指南](quickstart)。
### 管理用户 \{#manage-users\}

您可以选择在有或没有后端身份验证的情况下使用 Adapty。

Adapty SDK 对匿名用户和已识别用户的处理方式有所不同。请阅读[身份识别快速入门指南](ios-quickstart-identify)，以了解其中的细节，并确保您能正确处理用户信息。

## 步骤 1. 获取产品 \{#step-1-get-products\}

要为自定义付费墙获取产品，你需要：

1. 通过将[版位](placements) ID 传入 `getFlow` 方法来获取 `flow` 对象。
2. 使用 `getPaywallProducts` 方法获取该 flow 的产品数组。

<Tabs groupId="current-os" queryString>

<TabItem value="swift" label="Swift" default>
```swift

func loadPaywall() async {
    do {
        let flow = try await Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID")
        let products = try await Adapty.getPaywallProducts(flow: flow)

        // Use products to build your custom paywall UI
    } catch {
        // Handle the error
    }
}
```
</TabItem>

<TabItem value="swift-callback" label="Swift-Callback" default>
```swift

func loadPaywall() {
    Adapty.getFlow(placementId: "YOUR_PLACEMENT_ID") { result in
        switch result {
        case let .success(flow):
            Adapty.getPaywallProducts(flow: flow) { result in
                switch result {
                case let .success(products):
                    // Use products to build your custom paywall UI
                case let .failure(error):
                    // Handle the error
                }
            }
        case let .failure(error):
            // Handle the error
        }
    }
}
```
</TabItem>
</Tabs>
## 步骤 2. 处理购买 \{#step-2-accept-purchases\}

当用户在自定义付费墙中点击某个产品时，使用所选产品调用 `makePurchase` 方法。该方法将处理购买流程并返回更新后的用户画像。

<Tabs groupId="current-os" queryString>

<TabItem value="swift" label="Swift" default>
```swift

func purchaseProduct(_ product: AdaptyPaywallProduct) async {
    do {
        let purchaseResult = try await Adapty.makePurchase(product: product)
        
        switch purchaseResult {
        case .userCancelled:
            // 用户取消了购买
            break
        case .pending:
            // 购买待处理（例如，等待家长批准）
            break
        case let .success(profile, transaction):
            // 购买成功，用户画像已更新
            break
        }
    } catch {
        // 处理错误
    }
}
```
</TabItem>
<TabItem value="swift-callback" label="Swift-Callback" default>
```swift

func purchaseProduct(_ product: AdaptyPaywallProduct) {
    Adapty.makePurchase(product: product) { result in
        switch result {
        case let .success(purchaseResult):
            switch purchaseResult {
            case .userCancelled:
                // 用户取消了购买
                break
            case .pending:
                // 购买待处理（例如，等待家长批准）
                break
            case let .success(profile, transaction):
                // 购买成功，用户画像已更新
                break
            }
        case let .failure(error):
            // 处理错误
        }
    }
}
```
</TabItem>
</Tabs>
## 第三步：恢复购买 \{#step-3-restore-purchases\}

Apple 要求所有含订阅的应用提供让用户恢复购买的途径。虽然用户使用 Apple ID 登录时购买记录会自动恢复，但你仍需在应用中实现一个恢复按钮。

当用户点击恢复按钮时，调用 `restorePurchases` 方法。这将把用户的购买记录与 Adapty 同步，并返回更新后的用户画像。

<Tabs groupId="current-os" queryString>

<TabItem value="swift" label="Swift" default>
```swift

func restorePurchases() async {
    do {
        let profile = try await Adapty.restorePurchases()
        // Restore successful, profile updated
    } catch {
        // Handle the error
    }
}
```
</TabItem>

<TabItem value="swift-callback" label="Swift-Callback" default>
```swift

func restorePurchases() {
    Adapty.restorePurchases { result in
        switch result {
        case let .success(profile):
            // 恢复成功，用户画像已更新
        case let .failure(error):
            // 处理错误
        }
    }
}
```
</TabItem>
</Tabs>
## 后续步骤 \{#next-steps\}

:::tip
有疑问或遇到问题？欢迎访问我们的[支持论坛](https://adapty.featurebase.app/)，在那里你可以找到常见问题的解答，也可以提出自己的问题。我们的团队和社区随时为你提供帮助！
:::

您的付费墙已准备好在应用中展示。[在沙盒模式下测试您的购买](test-purchases-in-sandbox)，确保您可以从付费墙完成测试购买。

接下来，[检查用户是否已完成购买](ios-check-subscription-status)，以确定是否应展示付费墙或授予付费功能的访问权限。