什么是 StoreKit,为什么需要它?
\n\nStoreKit 是 Apple 内置的框架,用于在 iOS、macOS、watchOS 和 tvOS 应用中实现应用内购买和订阅。它为开发者提供了与 App Store 交互的统一接口:请求产品、处理交易、验证访问权限以及管理订阅。
\n\nStoreKit 解决的主要任务:
\n- \n
- 变现 — 销售数字商品(高级访问权限、虚拟货币、内容)。 \n
- 订阅管理 — 自动续订、状态、试用期。 \n
- 安全性 — 通过 App Store 处理付款,无需向开发者传输银行卡数据。 \n
- 恢复购买 — 用户可以将购买内容转移到其他设备。 \n
重要提示:StoreKit 不是第三方库,而是 Xcode SDK 的一部分。无需单独安装,但需要在 App Store Connect 中进行配置并添加到项目中。
\n\n安装与配置
\n\n由于 StoreKit 是系统框架,其安装只需在 Xcode 项目中连接即可:
\n\n- \n
- 在 Xcode 中打开您的项目。 \n
- 选择目标(您的应用)→ "General" 选项卡。 \n
- 滚动到 "Frameworks, Libraries, and Embedded Content" 部分。 \n
- 点击 "+" 并选择 StoreKit.framework。 \n
- 确保 "Embed" 状态设置为 "Do Not Embed"。 \n
之后,在需要的文件中导入框架:
\n\nimport StoreKit\n\n同时,务必在 App Store Connect 中配置产品:
\n- \n
- 创建产品标识符(例如
com.example.premium)。 \n - 指定价格、本地化、类型(消耗品/非消耗品/订阅)。 \n
- 对于订阅,配置订阅组和试用期。 \n
快速上手与代码示例
\n\n请求和购买产品的最小工作示例:
\n\nimport StoreKit\n\nclass StoreManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver {\n \n static let shared = StoreManager()\n private var products: [SKProduct] = []\n \n override private init() {\n super.init()\n SKPaymentQueue.default().add(self)\n }\n \n // 1. 请求产品\n func fetchProducts(productIDs: Set<String>) {\n let request = SKProductsRequest(productIdentifiers: productIDs)\n request.delegate = self\n request.start()\n }\n \n // 2. 获取产品的代理方法\n func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {\n self.products = response.products\n for product in products {\n print("找到产品: \\(product.localizedTitle) — \\(product.price)")\n }\n }\n \n // 3. 购买\n func purchase(product: SKProduct) {\n let payment = SKPayment(product: product)\n SKPaymentQueue.default().add(payment)\n }\n \n // 4. 处理交易\n func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {\n for transaction in transactions {\n switch transaction.transactionState {\n case .purchased:\n // 解锁内容\n print("购买成功: \\(transaction.payment.productIdentifier)")\n SKPaymentQueue.default().finishTransaction(transaction)\n case .failed:\n if let error = transaction.error {\n print("购买错误: \\(error.localizedDescription)")\n }\n SKPaymentQueue.default().finishTransaction(transaction)\n case .restored:\n print("购买")