iOS App Store Review Guidelines for IAP
复制一个包含安装步骤和本插件完整 Markdown 指南的配置提示。
在 App Store 上获得应用程序批准需要仔细关注苹果的指南,特别是在实施内购和订阅时。这个指南涵盖了您需要知道的所有内容,以便在第一次提交时通过审核。

在提交之前
标题:在提交之前完成 App Store Connect 设置
标题:完成 App Store Connect 设置在苹果审查您的购买流程之前,请确保应用程序记录本身是完整的:
- 添加 隐私政策 URL 在 App Store Connect
- 添加一个 支持URL 该 URL 必须指向用户的真实联系方式
- 完成 年龄等级 问卷,以便应用程序可以发布
- 添加 应用程序评论联系方式 并提供清晰的评论者注释
- 如果需要登录,请提供一个 演示账户,不会在审查期间过期
准备真实截图
标题:准备真实截图- 使用当前截图,从实际正在审查的构建中
- 对于 iPhone,
1290 x 2796(6.7 英寸) 是最简单的默认尺寸 - 如果您的应用程序支持 iPad,则上传 iPad 截图
- 当前接受的大型 iPad 尺寸包括
2064 x 2752(13 英寸) 和2048 x 2732(12.9 英寸) - Never stretch iPhone 截图来假装支持 iPad
在 TestFlight 中进行 Dry-Run 审核流程
Dry-Run the Reviewer Journey in TestFlight在真机上模拟 Apple 将遵循的精确路径:
- 从 TestFlight 安装最新的构建
- 使用您计划提供的审阅账户登录
- 在没有隐藏手势或调试菜单的情况下触达付费墙
- 完成购买、恢复和订阅管理流程
- 验证如果权限被拒绝,应用程序仍然正确运行
In-App 购买要求
In-App Purchase Requirements价格透明度(关键)
《定价透明度(关键)》苹果要求在任何购买前提供清晰的定价透明度:
必须包含的元素:
- 在购买按钮前显示精确的价格
- 显示计费频率(例如,“每月 $9.99”)
- 清晰地说明用户为他们的钱得到什么
- 指出费用何时发生
常见拒绝理由:
“订阅定价必须清晰明了。”
:::警告 价格一致性 所有价格必须在以下地方一致:
- App Store 元数据列表
- 内购屏幕
- 订阅管理屏幕
即使是 $1 的差异(商店列表 $4.99,应用 $5.99)也会触发自动拒绝。 :::
订阅计划展示
标题为“订阅计划展示”的部分必备披露:
- 同时显示所有可用订阅等级
- 每个等级的功能清晰对比
- 不通过 UI trick 自动跳转到高级等级
- 易于找到取消订阅的说明

符合规范的 UI 示例
import { NativePurchases } from '@capgo/native-purchases';
function SubscriptionScreen() { return ( <div> <h2>Choose Your Plan</h2>
{/* Show all tiers equally */} <PlanCard title="Basic" price="$4.99/month" features={['Feature A', 'Feature B']} /> <PlanCard title="Premium" price="$9.99/month" features={['All Basic', 'Feature C', 'Feature D']} highlighted={false} // Don't force premium />
{/* Clear cancellation info */} <Text> Cancel anytime in Settings > Subscriptions. No refunds for partial periods. </Text> </div> );}恢复购买
标题:恢复购买必备实现:
每个支持内购的应用程序都必须为用户提供恢复之前购买的方法,而不需要联系支持。
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function restorePurchases() { try { await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({ productType: PURCHASE_TYPE.SUBS, });
const activeSub = purchases.find( (purchase) => purchase.isActive && purchase.expirationDate, );
if (activeSub) { unlockPremiumFeatures(); showMessage('Purchases restored successfully!'); return; }
const { purchases: iaps } = await NativePurchases.getPurchases({ productType: PURCHASE_TYPE.INAPP, }); const hasIap = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
showMessage( hasIap ? 'Premium purchase restored!' : 'No previous purchases found.', ); } catch (error) { showError('Failed to restore purchases. Please try again.'); }}
// Add a visible "Restore Purchases" button<Button onClick={restorePurchases}> Restore Purchases</Button>常见拒绝原因
标题:常见拒绝原因1. 应用程序崩溃或功能不全
标题:1. 应用程序崩溃或功能不全失败原因:
- 应用程序在启动时崩溃
- 购买流程无法完成
- 截图中显示的功能无法正常工作
预防措施:
- 在真实设备上测试(而不是模拟器)
- 测试所有订阅流程
- 验证收据验证功能
- 检查网络错误处理
2. 元数据不匹配
标题:2. 元数据不匹配为什么会失败:
- 截图中显示的功能与当前版本不符
- 描述中提到的功能并不存在
- 元数据中的价格与应用内价格不同

预防措施:
// Document exactly what's in each tierconst SUBSCRIPTION_FEATURES = { basic: ['Ad-free', 'Cloud sync', 'Basic themes'], premium: ['Ad-free', 'Cloud sync', 'All themes', 'Priority support']};
// Use these in both your app AND App Store description3. 缺少权限说明
标题为“3. 缺少权限说明”为什么会失败:
- 未说明的摄像头/位置/健康权限请求
- 权限请求深藏在多个屏幕深处
- 模糊或通用权限描述
预防措施:
更新 Info.plist 以清晰的说明:
<key>NSCameraUsageDescription</key><string>Camera access is needed to scan product barcodes for quick subscription upgrades.</string>
<key>NSLocationWhenInUseUsageDescription</key><string>Location helps us show relevant local content in your Premium subscription.</string>4. 欺骗式营销
标题为“4. 欺骗式营销”为什么会失败:
- 没有证据的说法,如“世界上最受欢迎的应用”
- 具有隐藏限制的“无限”功能
- 制造假紧迫感的策略(“仅剩下2个位置!”)


预防:
- 描述要具体、事实性
- 避免无据之谈
- 不要以假的紧迫感压迫用户
5. 隐匿式取消流程
标题:5. 隐匿式取消流程为什么会失败:
- 没有说明如何取消
- 取消按钮被隐藏或遮挡
- 多步取消流程而不是使用苹果原生流程
预防:
// Always inform users about cancellationfunction SubscriptionInfo() { return ( <div> <h3>How to Cancel</h3> <ol> <li>Open iPhone Settings</li> <li>Tap your name at the top</li> <li>Tap Subscriptions</li> <li>Select this app and tap Cancel</li> </ol>
<p>Or manage directly in the App Store app.</p>
<Button onClick={openSubscriptionManagement}> Manage Subscription in Settings </Button> </div> );}
async function openSubscriptionManagement() { // Direct link to iOS subscription management await NativePurchases.showManageSubscriptions();}隐私 & 数据使用(第 5.1.1 节)
第 5.1.1 节标题:隐私 & 数据使用(第 5.1.1 节)2025 年,苹果公司对隐私要求进行了重大调整。
必备披露
第 5.1.1 节标题:必备披露每个权限都需要:
- 为什么需要它(具体用例)
- 何时使用
- 数据如何存储/共享
- 是否可选或必备
示例:正确的权限流程
第 5.1.1 节标题:示例:正确的权限流程async function requestCameraPermission() { // Show explanation BEFORE requesting await showDialog({ title: 'Camera Access', message: 'We need camera access to let you scan barcodes for quick product lookup. Your photos are never uploaded or stored.', buttons: ['Not Now', 'Allow'] });
// Then request permission const result = await Camera.requestPermissions(); return result.camera === 'granted';}隐私营养标签
《隐私营养标签》确保您的App Store隐私标签准确反映:
- 收集购买历史
- 电子邮件地址(用于收据)
- 设备ID(用于欺诈防御)
- 使用数据(用于分析)
2025年,错误的隐私标签是拒绝理由之一。审查您的数据收集非常重要。
提交前检查清单
《提交前检查清单》
-
测试所有购买流程
- 购买每个订阅等级
- 测试免费试用
- 验证引导性优惠正确应用
- 测试恢复购买
- 验证家庭共享(如果启用)
- 测试在多台设备上
-
验证定价一致性
- 检查App Store元数据与内购价格匹配
- 验证所有货币正确
- 确认免费试用期限与描述匹配
- 检查引导性优惠条款准确
-
Review All Copy
- 移除占位符文本
- 验证声明可测试
- 检查语法和拼写
- 确保描述与当前构建匹配
- 移除竞争对手提及
-
测试权限
- 仅请求必要权限
- 在请求之前显示清晰的说明
- 测试“拒绝”流程(应用程序仍应正常工作)
- 验证Info.plist描述清晰
-
准备测试账户
- 创建一个在审查期间有效的审查账户
- 在App Review信息中记录登录凭证
- 验证审查者可以访问付墙并完成购买流程
- 如果需要,请在Notes字段中包含额外的账户或应用特定的switch
-
检查元数据
- 截图与当前UI匹配
- 支持URL包含真实的联系信息
- 隐私政策URL已填写
- 应用程序的年龄等级与构建中的内容匹配
- 如果有应用预览视频,则显示当前版本
- 描述准确地描述了功能
- 隐私政策在应用程序内和商店列表中都可访问
-
写详细的评论笔记
Contact:Name: Jane DeveloperEmail: review@yourapp.comPhone: +1 555-0100Test Account:Email: reviewer@test.comPassword: TestPass123!This account does not expire during review.Testing Instructions:1. Log in with test account above2. Tap "Upgrade to Premium" button3. Select "Monthly Premium" subscription4. Complete purchase (no charge in sandbox)5. Verify premium features unlockNote: Subscription pricing is clearly shown before purchase.Cancellation instructions are in Settings > Account.
评论时间线
名为“评论时间线”的部分
标准评论: 24-48小时 高峰期: 3-5天(App Store节假日发布) 周末: 未处理评论 加速评论: 适用于关键错误修复(通过 App Store Connect 请求)
您在 App Store Connect 中会看到的常见状态:
Waiting for ReviewIn ReviewPending Developer ReleaseRejected
2026 年提交焦点
标题:2026 年提交焦点当前重点领域
标题:当前重点领域1. 订阅清晰度
- 需要进行侧面比较的计划
- 不允许使用“暗模式”隐藏更便宜的选项
- 清晰的降级/升级路径
2. 元数据准确性
- 截图必须与正在审查的构建匹配
- 如果启用了iPad支持,则需要iPad截图
- 支持URL和隐私政策应该在提交之前就已经发布
3.隐私和审查详细信息质量
- 隐私披露必须与您的SDK实际收集的内容匹配
- 应用程序审查联系信息和备注应该在第一次提交时就完成
- 演示凭证必须在整个审查窗口内保持有效
4.提交准备
- 苹果更新的最低SDK要求定期更新,因此在上传发布构建之前确认当前截止日期
- TestFlight是最安全的地方来验证在提交之前的准确审查者路径
原生购买插件最佳实践
最佳实践:原生购买插件正确处理错误
错误处理:原生购买插件import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string) { try { const transaction = await NativePurchases.purchaseProduct({ productIdentifier: productId, productType: PURCHASE_TYPE.SUBS, });
// Success await validateReceiptOnServer(transaction.receipt); showSuccess('Subscription activated!'); unlockFeatures();
} catch (error: any) { // Handle specific error cases if (error.code === 'USER_CANCELLED') { // User cancelled - don't show error console.log('Purchase cancelled by user'); } else if (error.code === 'PAYMENT_PENDING') { showInfo('Payment is pending. Please check back later.'); } else if (error.code === 'PRODUCT_ALREADY_PURCHASED') { // Restore instead await NativePurchases.restorePurchases(); } else { // Show user-friendly error showError('Unable to complete purchase. Please try again.'); } }}显示加载状态
复制到剪贴板function PurchaseButton({ productId }: { productId: string }) { const [loading, setLoading] = useState(false);
const handlePurchase = async () => { setLoading(true); try { await NativePurchases.purchaseProduct({ productIdentifier: productId }); } finally { setLoading(false); } };
return ( <button onClick={handlePurchase} disabled={loading}> {loading ? 'Processing...' : 'Subscribe Now'} </button> );}显示条款:原生购买插件
复制到剪贴板function SubscriptionTerms() { return ( <div className="terms"> <p> Subscription automatically renews unless cancelled at least 24 hours before the end of the current period. </p> <p> Your account will be charged for renewal within 24 hours prior to the end of the current period. </p> <p> Subscriptions may be managed by the user and auto-renewal may be turned off in Account Settings after purchase. </p> <p> <a href="/terms">Terms of Service</a> | <a href="/privacy/">Privacy Policy</a> </p> </div> );}复制到剪贴板
如果您的应用被拒绝解决步骤
解决步骤-
仔细阅读拒绝原因
- 注意被指出的具体指南(例如,3.1.1,5.1.1)
- 准确理解苹果旗帜
-
彻底解决问题
- 不要仅仅修复 - 修复根本原因
- 测试修复方案
- 记录您所做的更改
-
在解决中心回复
Thank you for your feedback. I have addressed the issue:Issue: Subscription pricing not clear upfrontFix: Added explicit pricing display on subscription selectionscreen showing "$9.99/month" before purchase button. Also addedcancellation instructions on the same screen.The changes are in this submission and can be tested using theprovided test account. -
尽快重新提交
- 重新提交通常会更快地被审查
- 通常在24小时内
申诉流程
《申诉流程》一章如果您认为拒绝是错误的:

- 点击 App Store Connect 的“申诉”
- 提供清晰的证据:
- 截图显示遵守
- 具体指南的引用
- 解释如何满足要求
- 保持专业和事实性
- 如果功能难以找到,请包含测试账户

额外资源
标题:额外资源如果您仍然遇到问题:
需要专家帮助?
Section titled “需要专家帮助?”应用程序审查中遇到困难或需要个人化帮助? 与我们的团队预约电话会议 专注于:
- IAP 实现评审和优化
- App Store 评审准备和策略
- 提交清单评审
- 拒绝解决方案和申诉
- 完成测试和验证
我们的专家已经成功帮助数百个应用程序通过评审!
继续从 iOS App Store Review 指南中的 IAP
标题为“继续从 iOS App Store Review 指南中的 IAP”如果您正在使用 iOS App Store Review 指南中的 IAP 来规划商店批准和分发,连接它到 使用 @capgo/native-purchases 为使用@capgo/native-purchases的原生能力 @capgo/capacitor-in-app-review 为@capgo/capacitor-in-app-review的实现细节 使用@capgo/capacitor-in-app-review 为使用@capgo/capacitor-in-app-review的原生能力 @capgo/capacitor-native-market 为@capgo/capacitor-native-market的实现细节,以及 使用@capgo/capacitor-native-market 为使用@capgo/capacitor-native-market的原生能力