---
title: "设置 12 个月承诺计划"
description: "在 App Store Connect 和 Adapty 中设置苹果按月付费的 12 个月承诺订阅，将其添加到自定义付费墙，并在沙盒中进行测试。"
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skills: `npx adapty skills install --yes`

:::important
要提供承诺计划，你需要一个年度 App Store 订阅、一个[自定义付费墙](paywalls)，以及 Adapty SDK v4.3 或更高版本。流程无法展示该计划。
:::

要让订阅者承诺订阅整年并按月付款，请在 App Store Connect 和 Adapty 中为您的年度产品添加 [12 个月承诺计划](app-store-12-month-commitment)。

## 开始之前 \{#before-you-begin\}

在实现承诺方案之前，请确认你已完成以下准备工作：

- **精准定位目标市场**：承诺计划不适用于美国。在德国、以色列、南非和土耳其，订阅用户可以通过 Apple Support 立即取消。
- **精准定位目标系统版本**：订阅用户需要 iOS 26.4 或更高版本，或相同版本的 iPadOS、macOS、tvOS 或 visionOS。请使用 Xcode 26.5 或更高版本构建应用。
- **精准定位目标价格区间**：12 个月付款的总金额必须在年付订阅价格的 1 倍到 1.5 倍之间。
- **使用 Adapty SDK v4.3 或更高版本**：在使用早期 SDK 版本的应用中，用户只能购买预付方案。
- **更新读取产品 ID 的代码**：Webhooks、集成、数据导出和服务端 API 会将承诺计划的购买记录为 `<product_id>:monthly`。如果您的代码会处理产品 ID，请在第一笔承诺计划购买发生前更新相关逻辑。

## 1. App Store Connect 配置 \{#1-app-store-connect-configuration\}

1. 在 App Store Connect 中打开一个年度订阅，或[创建一个新订阅](app-store-products)，时长设为 **1 Year**。
2. 在 **Availability** 部分，在 **1 Year Upfront** 和 **Monthly with 12-Month Commitment** 下添加相同的国家/地区。Apple 仅在提供预付费计费的地区才提供承诺计费。反之则不要求：你可以在没有承诺计划的国家/地区提供预付方案。
3. 在 **Subscription Prices** 部分，为你的基础地区设置预付价格（如果订阅尚未设置）。即使你只向用户展示承诺计划，Apple 也要求设置预付价格。
4. 为你的基础地区设置月价格。月价格必须为预付价格的 1/12 到 1/8。例如，预付价格为 €59.99 时，月价格可设为 €5.00 到 €7.49。

App Store Connect 会根据您的基础地区价格自动计算其他国家/地区的价格。

如需完整操作说明，请参阅 Apple 的指南：[提供按月付费的 12 个月承诺订阅](https://developer.apple.com/help/app-store-connect/manage-subscriptions/set-availability-for-an-auto-renewable-subscription#offer-monthly-subscriptions-with-12-month-commitment)。

## 2. Adapty 配置 \{#2-adapty-configuration\}

要在自定义付费墙中显示承诺计划，请在 Adapty 中为年度产品启用该功能。如果你不使用自定义付费墙，可以跳过此步骤。

1. 打开年度产品。如果该产品尚不存在，请[创建并关联](create-product#create-product-and-connect-existing-store-products)你在 App Store Connect 中设置的订阅。不要从 Adapty 推送新产品：这样会创建一个不含承诺计划的独立订阅。
2. 打开 **App Store** 标签页，选择 **Offer monthly payments with a 12-month commitment**。

3. 在弹出窗口中，从 **Monthly price, USD** 列表中选择与 App Store Connect 匹配的分期付款价格。该列表仅包含允许范围内的 App Store 价格点。此价格为参考值：Adapty 不会将其发送至 App Store Connect。

## 3. 设置优惠 \{#3-set-up-offers\}

在 App Store Connect 中，每个计费方案都有各自的新用户优惠、促销活动、赢回优惠和优惠码。针对预付款方案的优惠不适用于承诺方案。

- **免费试用及其他新用户优惠**：在 App Store Connect 中，为承诺计划设置优惠。Adapty 会自动应用[新用户优惠](app-store-offers#introductory-offers)。新用户优惠结束后，订阅者的 12 个月承诺期正式开始。
- **促销活动与赢回优惠**：在 App Store Connect 中，为承诺计划设置[促销活动](app-store-offers#promotional-offers)或[赢回优惠](app-store-offers#win-back-offers)。然后在 Adapty 中[添加这些优惠](create-offer)，并将其 **App Store plan** 设置为 **Monthly with 12-month commitment**。付费墙中的每一行仅显示该计费方案对应的优惠。如果你不使用自定义付费墙，则无需将这些优惠添加到 Adapty。
- **优惠码**：在 App Store Connect 中为承诺计划设置优惠码。

## 4. 添加到自定义付费墙 \{#4-add-to-a-custom-paywall\}

:::warning
Apple 要求你在购买前同时展示分期价格和年度总价。
:::

1. 在自定义付费墙中，[添加年度产品](add-product-to-paywall)，并将其 **Billing plan** 设置为 **Monthly**。若要在同一付费墙上同时销售预付方案，请再次添加该年度产品，并将 **Billing plan** 设置为 **Upfront**。
   - 若要为选择预付方案的用户提供预付优惠（适用于较早版本的 SDK，或不支持承诺方案的情况），请在 **Fallback offer** 下选择对应优惠。
2. 在应用中，从 `product.subscriptionPricingTerms` 获取价格并展示。对于可以购买承诺方案的用户，Adapty SDK 会返回承诺方案的价格；对于其他用户，SDK 则返回预付方案的价格：
   - 要判断 SDK 返回的是哪个方案，请检查 `product.subscriptionPricingTerms?.billingPlan`。承诺方案对应的值为 `.monthly`，预付方案对应的值为 `.upFront`。
   - 要展示分期价格，请使用 `subscriptionPricingTerms.localizedBillingPrice` 和 `subscriptionPricingTerms.billingPeriod`。
   - 要展示年度总价，请使用 `subscriptionPricingTerms.commitmentInfo.localizedPrice` 和 `subscriptionPricingTerms.commitmentInfo.period`。对于承诺方案，`product.localizedPrice` 和 `product.subscriptionPeriod` 返回相同的年度数据。

用户在以下情况下无法购买承诺计划：

- **不支持的操作系统版本或国家/地区**：用户的 Apple 设备系统版本低于 26.4，或该套餐在其 App Store 所在国家/地区不可用。Adapty SDK 将返回预付套餐的定价。
- **已有预付订阅**：StoreKit 报告该用户已订阅。如需切换套餐，订阅用户需通过 Apple 订阅设置操作。
- **[App Store 内的应用内购买](making-purchases#in-app-purchases-from-the-app-store)**：用户在 App Store 中选择产品，然后 Adapty SDK 在您的应用中发起购买。对于此类购买，SDK 仅支持预付套餐。

要停止提供承诺付款方案，请在自定义付费墙中，将年度产品的 **Billing plan** 设置为 **Upfront**，或删除 **Monthly** 行。您无法在 Adapty 中取消勾选 **Offer monthly payments with a 12-month commitment** 复选框。现有订阅者仍会每年续订新的承诺周期，除非您在 App Store Connect 中点击年度订阅的 **Remove Monthly Billing**。已做出承诺的订阅者将继续付款，直到其承诺期结束。

## 5. 在沙盒中测试方案 \{#test-the-plan-in-a-sandbox\}

参照[沙盒测试指南](test-purchases-in-sandbox)，使用两个沙盒账号进行测试：

- **来自你提供承诺方案的国家的账号**：付费墙应显示承诺方案，同时展示月价格和总价。购买后，该沙盒用户的用户画像应具备年度产品的访问等级。
- **美国账号**：付费墙应仅显示预付方案。

如果你的代码需要处理来自 webhook 或服务端 API 的产品 ID，请确认它能正确接收格式为 `<product_id>:monthly` 的承诺计划购买记录。

如需在本地测试购买逻辑，请使用 [Xcode 中的 StoreKit 测试](local-sk-files) 26.5 或更高版本。通过 StoreKit 测试完成的购买不会上报到 Adapty。

## 故障排查 \{#troubleshooting\}

- **月付复选框不显示**：**Offer monthly payments with a 12-month commitment** 复选框仅在设置了 App Store 产品 ID 的**年付**产品上显示，且需要填写**Price (USD)** 后才会激活。
- **用户看不到承诺方案的免费试用或其他优惠**：在 App Store Connect 中，每项优惠归属于一个计费方案。请为承诺方案[配置优惠](#3-set-up-offers)。对于促销活动或赢回优惠，还需在 Adapty 中将优惠的 **App Store plan** 设置为 **Monthly with 12-month commitment**。
- **所有用户都看到一次性付清的价格**：请确认以下两点：
  - 应用使用 Xcode 26.5 或更高版本构建。若使用更低版本，Adapty SDK 始终返回一次性付清方案的价格。
  - 在自定义付费墙中，年付产品的 **Billing plan** 设置为 **Monthly**。
- **部分用户看到一次性付清的价格**：这些用户[无法购买承诺方案](#4-add-to-a-custom-paywall)。
- **付费墙显示的是年度总价而非分期价格**：对于承诺方案，`product.localizedPrice` 返回年度总价。如需显示分期价格，请使用 `subscriptionPricingTerms.localizedBillingPrice`。