mcpField
S
storekit

storekit

github.com/johnrogers开发233157 次安装42 周前更新
代码仓库

关于 storekit

面向使用 async/await 和 SwiftUI 实现应用内购买的开发者的 StoreKit 2 技能,涵盖商品设置、交易、订阅、验证和本地测试。

主要功能

  1. 01商品加载与购买流程
  2. 02订阅和优惠处理
  3. 03交易更新与验证
  4. 04SwiftUI StoreKit 视图
  5. 05使用 .storekit 本地测试购买

适用场景

  1. 01添加应用内商品购买
  2. 02实现自动续期订阅
  3. 03恢复购买并授予权益
  4. 04在 Xcode 中测试购买流程

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/johnrogers/claude-swift-engineering --skill storekit

安装后在 Claude Code 中输入/storekit确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
getting-started.md
products.md
storekit-views.md
subscriptions.md
transactions.md

详细介绍

StoreKit

使用 async/await API、自动验证和 SwiftUI 集成实现应用内购买的 StoreKit 2 模式。

参考资料加载指南

只要内容有一丝可能会用到,就务必加载参考文件。 有上下文总比遗漏模式或出错好。

参考资料加载时机
入门指南设置 .storekit 配置文件、采用测试优先的工作流
产品加载产品、产品类型、使用 Product.purchase() 购买
订阅自动续期订阅、订阅组、优惠、续期跟踪
交易交易监听器、验证、完成交易、恢复购买
StoreKit 视图在 SwiftUI 中使用 ProductView、SubscriptionStoreView、SubscriptionOfferView

核心工作流

  1. 首先创建 .storekit 配置文件(在编写任何代码之前)
  2. 在 Xcode 模拟器中本地测试购买
  3. 使用 @MainActor 实现集中式 StoreManager
  4. 在应用启动时设置 Transaction.updates 监听器
  5. 使用 ProductView 或自定义 UI 展示产品
  6. 授予权益后务必调用 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() }
    }
}

常见错误

  1. 未调用 .finish() 完成交易 — 授予权益后忘记调用 transaction.finish() 会导致交易始终无法完成。用户将无法看到购买已生效。务必调用 finish()。

  2. StoreManager 状态不安全 — 未使用 @MainActor 的共享 StoreManager 可能出现竞态条件。多个异步任务可能同时更新 @Published 属性,导致状态损坏。使用 @MainActor 确保线程安全。

  3. 应用启动时未设置交易监听器 — 未设置 Transaction.updates 监听器可能导致应用崩溃,或漏掉已退款/已取消的购买。应在 @main 中立即监听交易,而不是等用户点击购买按钮时才开始监听。

  4. 硬编码产品 ID — 硬编码 ID 会增加测试和本地化的难度。使用配置文件或环境变量存储产品 ID。价格也一样(从 App Store 获取,不要硬编码)。

  5. 忽略验证失败 — App Store 验证有时会静默失败。不检查验证状态就意味着接受未经验证的交易(存在安全风险)。授予权益前务必进行验证。

评论

支持 Markdown