关于 storekit
面向使用 async/await 和 SwiftUI 实现应用内购买的开发者的 StoreKit 2 技能,涵盖商品设置、交易、订阅、验证和本地测试。
主要功能
- 01商品加载与购买流程
- 02订阅和优惠处理
- 03交易更新与验证
- 04SwiftUI StoreKit 视图
- 05使用 .storekit 本地测试购买
适用场景
- 01添加应用内商品购买
- 02实现自动续期订阅
- 03恢复购买并授予权益
- 04在 Xcode 中测试购买流程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ johnrogers/ claude-swift-engineering --skill storekit安装后在 Claude Code 中输入/storekit确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/getting-started.mdproducts.mdstorekit-views.mdsubscriptions.mdtransactions.md详细介绍
StoreKit
使用 async/await API、自动验证和 SwiftUI 集成实现应用内购买的 StoreKit 2 模式。
参考资料加载指南
只要内容有一丝可能会用到,就务必加载参考文件。 有上下文总比遗漏模式或出错好。
| 参考资料 | 加载时机 |
|---|---|
| 入门指南 | 设置 .storekit 配置文件、采用测试优先的工作流 |
| 产品 | 加载产品、产品类型、使用 Product.purchase() 购买 |
| 订阅 | 自动续期订阅、订阅组、优惠、续期跟踪 |
| 交易 | 交易监听器、验证、完成交易、恢复购买 |
| StoreKit 视图 | 在 SwiftUI 中使用 ProductView、SubscriptionStoreView、SubscriptionOfferView |
核心工作流
- 首先创建
.storekit配置文件(在编写任何代码之前) - 在 Xcode 模拟器中本地测试购买
- 使用
@MainActor实现集中式StoreManager - 在应用启动时设置
Transaction.updates监听器 - 使用
ProductView或自定义 UI 展示产品 - 授予权益后务必调用
transaction.finish()
基本架构
@MainActor
final class StoreManager: ObservableObject {
@Published private(set) var products: [Product] = []
@Published private(set) var purchasedProductIDs: Set<String> = []
private var transactionListener: Task<Void, Never>?
init() {
transactionListener = listenForTransactions()
Task { await loadProducts() }
}
}
常见错误
-
未调用
.finish()完成交易 — 授予权益后忘记调用transaction.finish()会导致交易始终无法完成。用户将无法看到购买已生效。务必调用finish()。 -
StoreManager 状态不安全 — 未使用
@MainActor的共享StoreManager可能出现竞态条件。多个异步任务可能同时更新@Published属性,导致状态损坏。使用@MainActor确保线程安全。 -
应用启动时未设置交易监听器 — 未设置
Transaction.updates监听器可能导致应用崩溃,或漏掉已退款/已取消的购买。应在@main中立即监听交易,而不是等用户点击购买按钮时才开始监听。 -
硬编码产品 ID — 硬编码 ID 会增加测试和本地化的难度。使用配置文件或环境变量存储产品 ID。价格也一样(从 App Store 获取,不要硬编码)。
-
忽略验证失败 — App Store 验证有时会静默失败。不检查验证状态就意味着接受未经验证的交易(存在安全风险)。授予权益前务必进行验证。
评论
支持 Markdown