App Store Connect 推介促销优惠:iOS 免费试用设置
作者:Mehdi Azizi
发布于 ,8分钟
推介促销优惠是 iOS 订阅开头的免费试用或折扣价,每个 Apple 账户在每个订阅群组中只能享受一次。
推介促销优惠(introductory offer)是自动续期订阅的起始价格,有三种形式:免费试用、提前支付或随用随付。每位用户在每个订阅群组中只能享受一次,所以你的 app 在写出“免费试用”之前,必须先检查用户是否有资格。优惠在订阅的价格页面里创建,你的付费墙必须清楚显示优惠时长,以及之后实际收取的价格。
在 Solys 和 TradaZen 上,7 天免费试用挂在年度订阅上,周订阅没有试用。下面我会讲三种优惠类型、谁有资格、怎么创建,以及我在显示环节犯过的两个错误。“首发优惠”这个说法通常指的是同一件事,我那篇讲付费墙错误的文章里也是这么用的。
什么是推介促销优惠?
App Store Connect 帮助文档把它定义为:订阅第一个周期内限时的折扣价或免费试用。它只适用于自动续期订阅。优惠结束后,订阅会按正常价格续期,除非用户在此之前取消。
优惠会在你的 App Store 产品页上向符合条件的用户展示。购买时,只要用户有资格,Apple 会自动应用优惠。你要做的,是别在屏幕上承诺一个 Apple 不会给的优惠。
推介促销优惠的三种类型
StoreKit 文档描述了三种支付方式。下面每种都配一个虚构的例子:年度订阅 39.99 欧元,月度订阅 6.99 欧元,这不是我任何一款 app 的真实价格。
| 类型 | 虚构示例 | 起始支付 | 之后 |
|---|---|---|---|
| 免费试用 | 免费 7 天 | 0 欧元 | 39.99 欧元/年 |
| 提前支付 | 3 个月 9.99 欧元 | 一次性 9.99 欧元 | 39.99 欧元/年 |
| 随用随付 | 2.99 欧元/月,共 3 个月 | 每月 2.99 欧元 | 6.99 欧元/月 |
每种类型在屏幕上该怎么写,还是用这些虚构价格:
- 免费试用:“免费 7 天,之后每年 39.99 欧元。”试用期间订阅其实已经开始,但结束前不会扣任何钱。
- 提前支付:“前 3 个月 9.99 欧元,之后每年 39.99 欧元。”用户为整个折扣期一次性付款。
- 随用随付:“前 3 个月每月 2.99 欧元,之后每月 6.99 欧元。”折扣价在每个周期都会收取。
三种情况下,文案里都必须包含优惠结束后要收取的价格。
谁有资格享受推介促销优惠?
Apple 的帮助文档说得很明白:每个订阅可以设置优惠,但每个用户在每个订阅群组中只能享受一次推介促销优惠。StoreKit 文档列出了三种情况:
- 新订阅者始终有资格;
- 回流的老订阅者,如果在这个群组里从没用过推介促销优惠,就有资格;
- 现有订阅者没有资格,即使他在同一群组内更换方案也不行。
资格跟着付款的 Apple 账户走,而不是跟着 iPhone,也不是跟着你 app 里注册的账户。试用过、取消、再重装 app 的人,已经没有资格了。可产品依然在宣传它的优惠:误导性显示就是这么产生的。
直接后果是:在周订阅上设试用,会用掉用户在年度订阅上的试用资格,因为两者在同一个群组里。这就是我只在年度订阅上设试用的原因。
还有一个限制:每个国家或地区只能有一个进行中的推介促销优惠和一个未来的优惠。如果两个优惠时间重叠,最后创建的会取代另一个。2026 年 7 月,我想在 TradaZen 的年度订阅上同时提供折扣价和免费试用。一次只能有一个优惠,只能二选一。最后我新建了第二个更便宜的年度订阅,用来挂试用。
在 App Store Connect 中创建优惠
你需要 Account Holder、Admin、App Manager 或 Marketing 角色。以下标签沿用 Apple 帮助文档中的名称:
- 在 Apps 中打开你的 app,然后点击侧边栏的 Subscriptions。
- 选择群组,再选择订阅。
- 在 Subscription Prices 部分,点击 View all Subscription Pricing,然后点击 Set up Introductory Offer。
- 选择国家或地区,再选择开始和结束日期。如果从今天开始,优惠会立即生效。
- 选择 Free、Pay up front 或 Pay as you go,然后设置时长和价格。
- App Store Connect 会为 175 个国家和地区给出等价价格。需要的话调整一下,然后确认。
优惠创建后就无法再修改:要改时长或价格,只能在 Introductory Offers 标签页里删掉再重建。改动同步到沙盒环境最多可能需要一小时。RevenueCat 文档也建议,最多等 24 小时,再判断优惠是否没有生效。
可选时长
免费试用可以是 3 天、1 周或 2 周、1、2、3 或 6 个月,或 1 年,与订阅时长无关。提前支付可覆盖 1、2、3 或 6 个月,或 1 年。随用随付取决于订阅时长:
| 订阅 | 随用随付 |
|---|---|
| 1 周 | 1 到 12 周 |
| 1 个月 | 1 到 12 个月 |
| 2 个月 | 2 到 12 个月,以 2 为单位 |
| 3 个月 | 3、6、9 或 12 个月 |
| 6 个月 | 6 或 12 个月 |
| 1 年 | 1 年 |
在我的 app 上,我选的是年度订阅配 7 天试用。这不是 Apple 的规则,而是产品上的选择,你要根据自己的数据来调整。
只向有资格的人显示试用
Apple 在同一个帮助页里写道:如果你在 app 内展示优惠,要确认用户真的能享受。让你的代码回答两个问题:这个产品有没有免费试用?这个用户还有没有资格?
第一个问题从产品信息里读。注意,推介促销优惠不一定是免费的。在 TradaZen 上,标准年度订阅挂的是提前支付,也就是第一年更便宜,而试用放在另一个年度订阅上。两者都会以“推介促销优惠”的形式返回。所以我的代码会读优惠价格:为零就是试用,大于零就是付费优惠。
第二个问题要问商店。在 Swift 中,StoreKit 2 从 iOS 15 起提供 isEligibleForIntroOffer。Apple 说明,即使没有配置优惠,这个值也可能为 true:所以才需要第一个问题。在 Expo app 中使用 RevenueCat 时,对应的是 checkTrialOrIntroductoryPriceEligibility,它返回有资格、无资格、无优惠或未知。下面是 TypeScript 的思路:
import Purchases, {
INTRO_ELIGIBILITY_STATUS as S,
type PurchasesStoreProduct,
} from "react-native-purchases";
type Essai = "oui" | "non" | "doute";
export async function essaiGratuit(p: PurchasesStoreProduct): Promise<Essai> {
if (!p.introPrice || p.introPrice.price > 0) return "non";
try {
const r = await Purchases.checkTrialOrIntroductoryPriceEligibility([
p.identifier,
]);
const statut = r[p.identifier]?.status;
if (statut === S.INTRO_ELIGIBILITY_STATUS_ELIGIBLE) return "oui";
if (statut === S.INTRO_ELIGIBILITY_STATUS_INELIGIBLE) return "non";
if (statut === S.INTRO_ELIGIBILITY_STATUS_NO_INTRO_OFFER_EXISTS)
return "non";
return "doute";
} catch {
return "doute";
}
}
(代码中 "oui" 表示“是”,"non" 表示“否”,"doute" 表示“不确定”。)
真正的难点是“不确定”这种情况。RevenueCat 把它的检查描述为尽力而为的估计,而且 Apple 的付款表单在用户确认前总会显示真实条款。对于未知状态,RevenueCat 建议显示正常价格,避免误导任何人。
问题的另一面,我是在 TradaZen 上学到的。第一个版本把读取错误当成了拒绝:有资格试用的人却看不到试用。现在,我的 app 只在商店明确拒绝时(无资格或无优惠)才隐藏试用。不确定时保留产品原本的显示。这是一种取舍,不是 RevenueCat 的建议:如果你更想稳妥,就按他们的建议来。无论哪种,都不要把“我不知道”当成“不行”。
如果你用 RevenueCat 的付费墙,根据他们的优惠说明页,每段文案都可以为有资格享受优惠的用户单独准备一个版本。其余的搭建步骤在我的 RevenueCat 实现 iOS 订阅指南里。
3.1.2 对屏幕显示的要求
准则 3.1.2(a) 允许订阅提供免费试用,前提是提供 App Store Connect 要求的信息。Apple 的订阅页面进一步说明:在试用的购买流程中,要清楚写明试用时长和结束后收取的价格。实际收取的金额也必须是屏幕上最醒目的价格元素。
Solys 在 2026 年 10 月 10 日收到的拒审就是这么说的:免费试用、首发价格和换算价格都必须从属于实际收取的金额。可以宣传试用,但之后收取的价格必须是屏幕上最清晰易读的价格。两次拒审和修复方法都在我的准则 3.1.2 指南里。
反过来的错误也存在:提供了试用却不说。有段时间,我付费墙上的按钮写的是“继续”。在 Solys 上,“免费 7 天”甚至只出现在 VoiceOver 标签里,屏幕上根本看不到。
在沙盒中测试优惠
用沙盒账户购买订阅:Apple 的付款表单上应该出现试用。要重走新订阅者的流程,在 iPhone 的沙盒账户设置里选择 Clear Purchase History。根据 Apple 的沙盒文档,这样账户就会重新获得推介促销优惠资格。
也要测试一个已经试用过的账户:你的付费墙不应再宣传任何免费内容。如果产品完全加载不出来,看看我关于 Missing Metadata 状态的指南。
不出错地接入免费试用
iOS & Android Kit 基于我自己 app 的起步代码:引导页、付费墙和订阅都已经写好,第三步“接入收款”会带你设置产品和试用。整条链路都写在 iOS 应用内订阅页面上。如果你还在犹豫用哪种模式,先看订阅还是一次性购买。
如果你在准备第一次上架,做一下免费诊断:它会帮你理清步骤顺序,并把我的 Apple 防拒审清单发给你。想送一个月或召回老订阅者,接下来请看我关于优惠代码的指南。
常见问题
App Store 上的推介促销优惠是什么?
它是自动续期订阅的起始价格:免费试用、提前支付或随用随付。它在 App Store Connect 中创建,购买时 Apple 会自动应用给符合条件的用户。之后订阅转为正常价格。
一个用户能试用两次吗?
在同一个订阅群组里不行:每个 Apple 账户在每个群组中只能享受一次推介促销优惠。重装 app 不会恢复资格。不过,如果他订阅你 app 里另一个群组的订阅,就可以享受那个群组的优惠。
免费试用和折扣能叠加吗?
同一个订阅在同一时间不行:每个国家或地区只能有一个进行中的推介促销优惠。你可以新建第二个订阅来挂另一个优惠,或者使用优惠代码,根据你的设置,它可以接在推介促销优惠之后生效。
添加试用需要发布新版本的 app 吗?
优惠本身不需要:它在 App Store Connect 中设置,购买时生效。但如果你的付费墙在代码里写死了“7 天”,就得更新。从商店返回的产品信息里读取时长,屏幕就会自动跟上。
老订阅者有资格免费试用吗?
有,只要他在这个订阅群组里从没用过推介促销优惠。如果已经用过,就没有资格了,哪怕过了好几个月也一样。想让他回来,Apple 提供了赢回优惠和促销优惠。

