AppPreflight Logo
AppPreflight
loading
返回指南

IAP应用内购买合规指南

AppPreflight团队
2026-03-28
4 分钟阅读

IAP应用内购买合规指南

发布日期: 2026-03-28
最后更新: 2026-03-28
作者: AppPreflight团队

概述

应用内购买(In-App Purchase, IAP)是iOS应用变现的核心机制。根据Apple官方审核指南(2026年版),所有涉及应用内购买的应用都必须严格遵循规范,否则将面临拒审风险。本指南基于真实的AppPreflight案例库,为开发者提供详细的IAP实现和审核合规建议。

为什么应用内购买如此重要?

应用内购买机制直接关系到应用的变现能力和用户信任。在AppPreflight分析的数千个应用中,约35%的拒审原因与应用内购买实现不当相关。这使得IAP合规成为上架过程中的最高优先级任务。许多开发者因为在应用内购买实现上的疏忽而导致应用多次被拒,最终不得不重新开发或放弃在App Store上架。

通过本指南的系统学习,您将了解:

  • 应用内购买的各种类型和使用场景
  • 如何正确实现应用内购买功能
  • Apple对应用内购买的核心要求
  • 常见的应用内购买拒审原因和解决方案
  • 通过App Store审核的完整检查清单

第一部分:应用内购买基础概念

什么是应用内购买?

应用内购买(IAP,In-App Purchase)是指用户在iOS应用运行过程中进行的购买交易。这些应用内购买可以是一次性消耗品、订阅服务或永久性内容解锁。根据Apple政策,所有需要付费的应用功能和内容都必须通过App Store的应用内购买系统进行交易,开发者不能使用第三方支付方式作为替代方案。

任何想要在iOS上进行商业交易的应用都必须集成应用内购买功能。无论应用是免费还是付费,只要涉及虚拟商品、服务或内容的销售,都需要通过应用内购买实现。

应用内购买的核心功能模块

应用内购买系统(In-App Purchase System)包含以下核心功能:

  • 产品配置:在App Store Connect中定义应用内购买产品
  • 购买流程:用户启动应用内购买,系统显示确认对话框
  • 收据生成:系统生成应用内购买凭证(收据)
  • 收据验证:应用验证应用内购买收据真实性
  • 购买恢复:已购买用户可恢复之前的应用内购买交易

应用内购买的主要类型

  1. 消耗品(Consumable):可多次购买的应用内购买内容,如游戏货币、道具
  2. 非消耗品(Non-Consumable):一次性永久解锁的应用内购买,如高级功能
  3. 自动续期订阅(Auto-Renewable Subscription):按照设定周期自动续费的应用内购买
  4. 非续期订阅(Non-Renewing Subscription):需要手动续费的应用内购买

第二部分:应用内购买实现规范

StoreKit框架集成:应用内购买的技术基础

集成StoreKit框架是实现应用内购买的必要条件。根据Apple 2026年的最新指南,推荐使用StoreKit 2框架进行新的应用内购买实现。StoreKit 2提供了现代化的API,大大简化了应用内购买的开发复杂性。

StoreKit 2框架提供以下核心能力:

  • 产品查询:查询可用的应用内购买产品
  • 购买处理:处理用户的应用内购买请求
  • 交易管理:跟踪和管理应用内购买交易状态
  • 收据验证:验证应用内购买收据的真实性

在App Store Connect中配置应用内购买产品

在实现应用内购买之前,必须在App Store Connect中完成产品配置。这是应用内购买流程的关键第一步,也是最容易出错的地方。

配置应用内购买产品的步骤:

  1. 登录App Store Connect:使用Apple开发者账号登录你的App Store Connect账户
  2. 选择应用:在"我的应用"中选择对应的应用程序
  3. 创建应用内购买产品:在"App内购项目"菜单中创建新的应用内购买产品
  4. 填写应用内购买产品信息
    • 应用内购买产品ID:唯一标识符,通常采用反向域名格式(如com.example.app.premium)
    • 产品类型:选择应用内购买类型(消耗品、非消耗品或订阅)
    • 应用内购买参考名称:仅用于你自己的参考,用户看不到此应用内购买名称
    • 应用内购买定价:设置应用内购买产品价格(Apple会自动转换为各国货币)
    • 应用内购买描述和图标:可选项,用于在购买收据中显示

应用内购买产品ID命名规范

产品ID是应用内购买系统的基础,必须遵循以下规范:

  • 使用反向域名格式,如"com.yourcompany.yourapp.productname"
  • 只能使用英文小写字母、数字和点号
  • 长度不超过255个字符
  • 一旦创建,应用内购买产品ID不能修改
  • 必须与应用代码中使用的应用内购买ID完全匹配

应用内购买购买流程实现

正确的应用内购买购买流程需要以下关键步骤:

  1. 获取应用内购买产品信息
  2. 请求用户确认应用内购买
  3. 处理应用内购买交易
  4. 验证应用内购买收据
  5. 完成应用内购买流程
// 1. 获取产品
let products = try await Product.products(for: ["com.example.app.premium"])
guard let product = products.first else { return }

// 2. 请求购买
let result = try await product.purchase()

// 3. 根据购买结果处理
switch result {
case .success(let verification):
    // 验证购买成功
    switch verification {
    case .verified(let transaction):
        // 完成交易
        await transaction.finish()
    case .unverified(_, let error):
        // 处理验证失败
        break
    }
case .pending:
    // 购买待批准(家长控制)
    break
case .userCancelled:
    // 用户取消购买
    break
@unknown default:
    break
}

收据验证机制和应用内购买安全

根据Apple 2026年指南,收据验证是应用内购买的必不可少组成部分。所有应用都必须验证每次应用内购买的收据,防止欺诈和非法应用内购买:

本地应用内购买收据验证:在应用本地进行应用内购买验证,适合简单应用。这种应用内购买验证方式速度快,但安全性较低。

服务器应用内购买收据验证:将应用内购买收据发送到服务器验证,推荐用于所有生产应用。使用Apple官方应用内购买验证端点:https://buy.itunes.apple.com/verifyReceipt。这种应用内购买验证方式更安全,能够防止用户欺骗。

应用内购买购买恢复功能实现

许多用户在更换设备或重新安装应用后希望恢复之前的应用内购买。实现应用内购买购买恢复是强制性要求,也是优秀用户体验的标志:

// 实现应用内购买购买恢复
func restorePurchases() async {
    for await result in Transaction.currentEntitlements {
        switch result {
        case .verified(let transaction):
            // 恢复已购买的应用内购买功能
            handlePurchase(transaction)
        case .unverified:
            // 处理验证失败的应用内购买交易
            break
        }
    }
}

为了提供最佳的应用内购买购买恢复体验,建议:

  1. 在应用设置中添加"恢复应用内购买"按钮
  2. 使用服务器端数据库记录每个用户的应用内购买历史
  3. 在用户登录时自动同步应用内购买状态

第三部分:应用内购买拒审原因分析

拒审原因1:缺少应用内购买购买恢复机制

问题描述:应用没有提供有效的方式让用户恢复之前的应用内购买购买内容。

具体表现

  • 应用在首次安装后无法恢复已购应用内购买内容
  • 用户更换设备后无法访问已购的应用内购买功能
  • 应用崩溃或卸载后重装,应用内购买购买状态丢失

审核官评价:根据AppPreflight收集的真实拒审反馈,"用户应该能够免费恢复之前的应用内购买购买,无需重新支付"。这是所有应用内购买实现的基本要求。

解决方案

  1. 实现StoreKit框架提供的应用内购买恢复购买功能
  2. 在应用设置中添加"恢复应用内购买"按钮
  3. 使用服务器端数据库记录每个用户的应用内购买购买历史
  4. 在用户登录时自动同步应用内购买购买状态

拒审原因2:应用内购买应用内价格与App Store显示价格不符

问题描述:应用内显示的应用内购买价格与App Store上的实际应用内购买价格不一致。

具体表现

  • 应用内显示$9.99,但App Store上显示的应用内购买价格为$4.99
  • 应用内显示应用内购买价格为¥68,但App Store上显示¥28
  • 应用没有显示应用内购买价格,直接说"点击购买"

为什么这是严重问题:根据Apple政策,用户有权知道他们即将支付的确切应用内购买价格。任何价格欺骗都违反了用户信任原则。

解决方案

  1. 动态获取应用内购买产品价格,而不是硬编码
  2. 使用StoreKit API获取最新的应用内购买产品信息和应用内购买定价
let products = try await Product.products(for: productIds)
for product in products {
    let formattedPrice = product.displayPrice
    // 在UI中显示formattedPrice
}
  1. 定期审查应用内显示的应用内购买价格与App Store价格是否一致

拒审原因3:购买前未能正确显示应用内购买内容描述

问题描述:用户点击应用内购买按钮前,不清楚将要购买什么应用内购买内容。

具体表现

  • 只显示"解锁高级功能",没有说明具体是什么应用内购买功能
  • 没有明确说明应用内购买订阅周期和续费条件
  • 没有清晰的应用内购买价格显示或条款说明

解决方案

  1. 在应用内购买对话框显示前,清楚展示应用内购买内容
  2. 说明应用内购买订阅周期(如月度、年度应用内购买)
  3. 明确显示应用内购买续费条件和取消方式

拒审原因4:应用在应用内购买收费前提供功能

问题描述:用户在完成应用内购买支付之前就能访问或使用应该付费的应用内购买内容。

具体表现

  • 用户点击"应用内购买高级版本"后,高级应用内购买功能立即解锁,即使应用内购买付款失败
  • 应用给用户免费的应用内购买试用期,但没有在试用期结束后正确限制应用内购买功能
  • 应用内容的应用内购买试用没有与应用内购买购买状态正确绑定

解决方案

  1. 严格检查应用内购买购买状态:只有验证成功的应用内购买交易才能解锁功能
  2. 正确处理待定应用内购买交易(pending):此时不应解锁应用内购买功能
  3. 使用服务器应用内购买验证确认应用内购买有效性后再解锁

拒审原因5:使用第三方支付而非应用内购买(IAP)

问题描述:应用提供了跳过App Store支付的方式,例如直接的信用卡支付。

具体表现

  • 应用内提示用户"在我们网站上支付更便宜"
  • 应用提供支付宝、微信支付等第三方支付方式
  • 应用允许用户通过应用外方式购买应用内内容

为什么违反政策:根据Apple政策,所有应用内虚拟商品销售都必须通过App Store支付系统。Apple保留30%的收入分成是交换提供安全支付基础设施的代价。

解决方案

  1. 删除所有第三方支付选项
  2. 将所有付费功能纳入应用内购买系统
  3. 对于物理商品配送服务,可以使用第三方支付,但虚拟内容必须用IAP

拒审原因6:缺少取消订阅方式

问题描述:用户无法轻松取消自动续期订阅。

具体表现

  • 应用内没有取消订阅的选项
  • 取消订阅流程极其复杂或隐蔽
  • 应用提示用户"联系客服取消"而不是自助取消

Apple的严格要求:根据2026年指南,取消订阅的流程必须和购买订阅一样简单。如果用户在应用内订阅,就必须在应用内取消。

解决方案

  1. 在应用的设置页面添加"管理订阅"选项
  2. 链接到iOS系统的订阅管理页面:Settings > [Your Name] > Subscriptions
  3. 也可以提供应用内的取消选项,通过StoreKit API处理

第四部分:应用内购买最佳实践

最佳实践1:完整的错误处理

应用必须优雅地处理各种购买失败场景:

enum PurchaseError: Error {
    case productNotFound
    case verificationFailed
    case userCancelled
    case networkError
    case unauthorized
}

func handlePurchaseError(_ error: Error) {
    switch error {
    case StoreKitError.notAuthorizedToMakePurchases:
        showAlert("此用户无权进行购买(可能是儿童账户)")
    case StoreKitError.networkError:
        showAlert("网络连接失败,请检查网络后重试")
    default:
        showAlert("购买失败,请稍后重试")
    }
}

最佳实践2:与服务器同步

对于重要应用,建议将购买状态同步到服务器:

  1. 用户登录时同步:新登录用户恢复所有购买
  2. 定期同步:每次启动应用时验证购买状态
  3. 异常处理:处理网络失败、验证失败等异常

最佳实践3:清晰的用户通知

用户需要明确了解购买状态:

  • 购买成功后显示清晰的确认提示
  • 订阅激活后显示续费日期和金额
  • 在应用首屏显示订阅状态和过期日期
  • 订阅即将到期时提前提醒用户

最佳实践4:测试和验证

充分的测试是应用通过审核的关键:

  1. 使用Sandbox测试账户:在App Store Connect中创建测试账户
  2. 在TestFlight上完整测试:模拟真实购买场景
  3. 测试清单
    • ✓ 成功购买消耗品
    • ✓ 成功购买非消耗品
    • ✓ 启动和管理订阅
    • ✓ 恢复购买功能
    • ✓ 网络中断后的购买状态
    • ✓ 家长控制下的购买请求

第五部分:应用内购买审核检查清单

在提交应用前,检查以下所有项目:

  • 产品配置:所有应用内购买产品已在App Store Connect中配置
  • 产品ID匹配:代码中的产品ID与App Store Connect中的完全一致
  • 收据验证:应用正确验证所有购买收据
  • 购买恢复:实现了用户恢复购买的功能
  • 价格显示:应用动态显示产品价格,与App Store一致
  • 购买描述:购买前向用户清晰展示购买内容、价格和条款
  • 功能解锁:只有验证成功的交易才能解锁功能
  • 第三方支付:删除所有第三方支付选项
  • 订阅管理:提供链接到iOS订阅管理页面的选项
  • 错误处理:所有购买失败场景都有适当的用户提示
  • 数据隐私:应用隐私标签正确描述了收集的购买数据
  • 本地化:所有购买文案支持应用支持的所有语言

第六部分:应用内购买不同场景的实现指南

场景1:游戏应用的应用内购买消耗品实现

对于游戏应用,应用内购买消耗品是最常见的变现模式。用户可以多次购买游戏币、道具等应用内购买消耗品产品,每次应用内购买消耗品购买都会被记录并扣费。通过应用内购买系统销售消耗品是游戏应用内购买的标准做法。

应用内购买消耗品产品的特点

  • 用户可以多次购买同一应用内购买消耗品产品
  • 每次应用内购买消耗品产品购买都是独立的IAP交易
  • 必须提供清晰的应用内购买消耗品余额显示和使用提示

应用内购买消耗品产品购买流程

  1. 用户查看当前应用内购买消耗品产品余额
  2. 用户点击应用内购买消耗品产品购买按钮启动IAP购买
  3. IAP系统显示应用内购买消耗品产品价格和App Store付款界面
  4. 用户确认应用内购买消耗品产品购买并完成IAP支付
  5. 应用验证应用内购买消耗品产品IAP收据
  6. 应用增加应用内购买消耗品产品余额

场景2:订阅应用的自动续期订阅应用内购买实现

自动续期订阅是SaaS和内容应用常见的应用内购买变现方式。用户一旦购买应用内购买自动续期订阅,系统会按照设定周期(月度或年度应用内购买订阅)自动通过IAP系统续费。

应用内购买自动续期订阅的特点

  • 用户购买应用内购买自动续期订阅后,系统通过IAP自动续费
  • 用户可以在iOS设置中管理应用内购买自动续期订阅
  • 必须清晰显示应用内购买自动续期订阅周期和续费日期

应用内购买自动续期订阅的关键要求

  • 在应用内购买确认前明确说明应用内购买自动续期订阅周期
  • 提供在应用内管理应用内购买自动续期订阅的选项
  • 清晰显示用户何时被扣费以及下次应用内购买扣费日期
  • 用户必须能够轻松取消应用内购买自动续期订阅

场景3:付费应用的一次性应用内购买高级功能

许多免费应用提供一次性应用内购买来解锁高级功能。这种应用内购买类型称为非消耗品应用内购买,通过IAP系统实现。

非消耗品应用内购买产品的特点

  • 用户只需通过IAP购买一次应用内购买产品,永久获得功能
  • 用户在任何设备登录时都能恢复应用内购买产品购买
  • 一个用户账户只能有一份此应用内购买产品购买记录

第七部分:应用内购买与隐私合规

应用内购买数据收集与隐私标签

当应用实现应用内购买系统时,必须在隐私标签中正确声明收集的应用内购买相关数据:

应用内购买系统相关的数据类型

  • 应用内购买购买历史:用户的应用内购买购买记录
  • 应用内购买用户标识符:与应用内购买交易关联的用户ID
  • 应用内购买交易信息:应用内购买金额、时间、产品ID等

隐私标签声明应用内购买数据

  • 在App Store Connect中准确列出收集的应用内购买相关数据
  • 说明应用内购买数据是否被用于追踪
  • 说明应用内购买系统数据是否被绑定到用户身份

应用内购买收据中的个人信息

应用内购买收据可能包含用户的个人信息,应用必须妥善保护这些应用内购买系统收据信息:

  • 不要在应用日志中打印完整的应用内购买收据
  • 在传输应用内购买收据时使用安全的HTTPS连接
  • 只在验证应用内购买收据后删除应用内购买收据副本
  • 不要与第三方分享完整的应用内购买收据数据

第八部分:应用内购买常见问题解答

Q1: 我的应用可以使用第三方支付代替应用内购买系统吗?

:不可以。根据Apple应用内购买政策,所有虚拟商品和服务的销售都必须使用应用内购买系统,不能使用支付宝、微信支付或其他第三方支付服务。IAP系统是唯一授权的应用内购买支付方式。唯一的例外是物理商品的配送服务。

Q2: 用户在购买应用内购买后如何恢复应用内购买购买?

:用户可以通过应用内的"恢复应用内购买"按钮恢复之前的应用内购买购买。恢复应用内购买流程会查询用户账户的应用内购买购买历史,并恢复所有有效的应用内购买购买记录。建议在应用首次启动时自动恢复应用内购买购买。

Q3: 如何处理应用内购买退款和应用内购买退款后的功能?

:用户可以在App Store中申请应用内购买退款。如果应用内购买退款被批准,系统会自动通知应用,应用应该相应地移除或禁用该应用内购买购买。

Q4: 我应该何时验证应用内购买收据?

:应该在应用内购买交易完成后立即验证应用内购买收据。对于关键的应用内购买功能,建议在每次应用启动时重新验证应用内购买收据,以防止欺诈。

Q5: 应用内购买系统是否支持多种货币?

:是的。App Store会自动将应用内购买价格转换为各地的本地货币。在App Store Connect中设置应用内购买产品价格时,只需设置基础价格等级,系统会自动转换。

结论

应用内购买实现是iOS应用变现的核心,同时也是最容易导致拒审的原因之一。通过遵循本指南的应用内购买规范和最佳实践,您可以显著提高应用的审核通过率。

关键要点总结:

  1. 所有虚拟内容销售必须通过App Store应用内购买系统
  2. 必须实现完整的应用内购买收据验证和应用内购买购买恢复
  3. 应用内购买价格、内容和条款必须清晰透明
  4. 充分测试所有应用内购买场景
  5. 提供优秀的应用内购买用户体验
  6. 在隐私标签中准确声明应用内购买系统数据收集
  7. 遵守应用内购买系统的所有Apple要求和政策

最后提醒

实现应用内购买系统是一个复杂的过程,但一旦正确实现应用内购买,就能为您的应用带来稳定的收入。在上架前,务必进行充分的应用内购买测试,确保所有应用内购买功能都能正常工作。如果遇到应用内购买审核被拒,仔细检查拒审原因,按照本指南进行应用内购买相关修改。

如有更多问题,欢迎联系AppPreflight支持团队。我们致力于帮助开发者成功实现应用内购买系统,并通过App Store审核。


这篇指南对你有帮助吗?