在 iOS SDK 中进行应用内购买
在移动应用中展示付费墙是向用户提供高级内容或服务访问权限的关键步骤。但是,仅仅展示付费墙只有在你使用付费墙编辑工具自定义付费墙时,才足以支持购买流程。
如果你没有使用付费墙编辑工具,则必须使用一个名为 .makePurchase() 的独立方法来完成购买并解锁所需内容。该方法是用户与付费墙交互并完成所需交易的入口。
如果您的付费墙为用户尝试购买的产品设置了有效的促销活动,Adapty 会在购买时自动应用该促销活动。
请注意,只有在使用付费墙编辑工具创建的付费墙时,新用户优惠才会被自动应用。
在其他情况下,您需要在 iOS 上验证用户是否符合新用户优惠资格。跳过此步骤可能导致您的应用在发布审核时被拒。此外,还可能对本应享受新用户优惠的用户收取全额费用。
请确保已完成初始配置且没有跳过任何步骤。没有初始配置,我们将无法验证购买。
发起购买
请求参数:
| 参数 | 是否必填 | 描述 |
|---|---|---|
| Product | 必填 | 从付费墙获取的 AdaptyPaywallProduct 对象。 |
响应参数:
| 参数 | 描述 |
|---|---|
| Profile | 请求成功时,响应中会包含此对象。AdaptyProfile 对象提供了用户在应用内的访问等级、订阅及一次性购买的完整信息。 请检查访问等级状态,以确认用户是否具备访问应用所需的权限。 |
注意: 如果你使用的 Apple StoreKit 版本低于 v2.0,且 Adapty SDK 版本低于 v2.9.0,则需要提供 Apple App Store 共享密钥。此方法目前已被 Apple 废弃。
来自 App Store 的应用内购买
当用户在 App Store 发起购买,且交易转入你的应用时,SDK 会调用 didReceivePromotedPurchase 代理方法,并传入一个 AdaptyPromotedProduct 对象。你有两种处理方式:
- 立即处理交易: 无需实现
didReceivePromotedPurchase。默认实现会立即开始购买,Apple 购买系统界面会自动显示。 - 保存产品对象以供后续处理: 实现
didReceivePromotedPurchase,保存产品,然后在适当时机调用makePurchase传入已保存的产品。如果需要在触发购买前向用户展示自定义内容,此方式会很有用。
如果被推广的产品附带订阅优惠,SDK 会在购买时自动应用该优惠。该优惠从 App Store 购买意图中读取,仅在 iOS 18.0 及更高版本上可用。在 iOS 16.4–17.x 上,subscriptionOffer 始终为 nil,购买将以原价进行。
以下是完整代码片段:
final class YourAdaptyDelegateImplementation: AdaptyDelegate {
// 1. Store the product object to defer the transaction.
// To process the transaction immediately instead, don't implement this method —
// the default implementation starts the purchase right away.
nonisolated func didReceivePromotedPurchase(_ product: AdaptyPromotedProduct) {
// store the product object
}
// 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
func continueDeferredPurchase() async {
let storedProduct: AdaptyPromotedProduct = // get the product object from 1.
do {
let purchaseResult = try await Adapty.makePurchase(product: storedProduct)
// process the purchase result
} catch {
// handle the error
}
}
}
didReceivePromotedPurchase API 从 SDK 4.1 版本开始支持,且需要 iOS 16.4 或更高版本。SDK 4.0 完全不支持推广内购,且在低于 iOS 16.4 的设备上该方法永远不会触发。如果你需要在更早的 iOS 版本上支持推广购买,请继续使用 SDK 3.x 并按以下方式使用 shouldAddStorePayment。
正在使用 Adapty SDK 3.x?
在 SDK 3.x 中,SDK 会调用 shouldAddStorePayment 代理方法:
- 立即处理交易: 在
shouldAddStorePayment中返回true,这将立即触发 Apple 购买系统界面。 - 暂存产品对象,稍后处理: 在
shouldAddStorePayment中返回false,之后再调用makePurchase并传入已暂存的产品对象。
final class YourAdaptyDelegateImplementation: AdaptyDelegate {
nonisolated func shouldAddStorePayment(for product: AdaptyDeferredProduct) -> Bool {
// 1a.
// Return `true` to continue the transaction in your app. The Apple purchase system screen will show automatically.
// 1b.
// Store the product object and return `false` to defer or cancel the transaction.
false
}
// 2. Continue the deferred purchase later on by passing the product to `makePurchase` when the timing is appropriate
func continueDeferredPurchase() async {
let storedProduct: AdaptyDeferredProduct = // get the product object from 1b.
do {
try await Adapty.makePurchase(product: storedProduct)
} catch {
// handle the error
}
}
} 在 iOS 中兑换优惠码
关于优惠码
优惠码允许你向特定用户提供折扣或免费试用。与自动应用的常规优惠不同,优惠码通过应用外渠道分发——例如电子邮件营销、社交媒体或印刷材料。用户可通过在 App Store 中输入代码、访问兑换链接或使用应用内对话框来兑换。
要设置优惠码,请在 App Store Connect 中打开某个订阅,并进入其 Offer Codes 部分。你可以创建三种类型的优惠码:
- Free — 订阅在设定时长内免费,下次续费恢复原价。
- Pay as you go — 用户在设定时长内每个计费周期以折扣价付费,之后订阅恢复原价续费。
- Pay up front — 用户为整个优惠期限支付一次性折扣价,之后订阅恢复原价续费。
你无需将优惠码添加到 Adapty。Apple 会在优惠期间为每笔交易打上优惠码类别标签,包括初次兑换和所有后续折扣续费。Adapty 检测到该标签后,会将每笔交易记录为优惠类别 offer_code。优惠期结束、订阅以原价续费后,该标签将不再存在。你可以在 Adapty 看板中通过 Offer Code 优惠类型筛选分析数据。
收入差异排查
如果你发现 Adapty 中某笔优惠码交易显示的是产品原价而非折扣价,请在 App Store Connect 中核查以下内容:
- 优惠码已为用户可兑换的所有地区配置了正确的定价。
- 已为用户所在的特定国家或地区设置了优惠价格。Apple 在交易中发送的是地区价格。如果该优惠未配置对应地区的价格,Apple 可能会发送产品原价。
你可以在 Adapty 看板中通过 Offer Code 优惠类型和 Offer Discount Type 筛选条件来过滤和核查优惠码交易。
旧版促销码(已弃用)
Apple 于 2026 年 3 月弃用了应用内购买的促销码。优惠码以更强大的功能取而代之:可配置的使用资格、过期日期,以及每季度最多 100 万个代码。如果你此前使用促销码进行应用内购买,请在 App Store Connect 中迁移至优惠码。
旧版促销码(每个应用每个版本限 100 个)可免费授予订阅访问权限。与优惠码不同,Apple 不会在促销码交易中包含折扣信息——它在收据中发送的是产品原价。因此,Adapty 会以原价记录这些交易,导致 Adapty 分析数据与 App Store Connect 之间出现收入差异。
如果你看到历史交易以原价记录但实际上应为免费,这些很可能来自旧版促销码。由于这些代码现已弃用,请迁移至优惠码以确保收入数据准确。
要在您的应用中显示优惠码兑换界面:
Adapty.presentCodeRedemptionSheet()
根据我们的观察,部分应用中的优惠码兑换界面可能无法稳定运行。我们建议直接将用户重定向至 App Store。
为此,您需要打开以下格式的 URL:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}