用途
这是一份 StoreKit 2 的完整 API 参考,用于在 Apple 平台实现应用内购买。适合以下场景:使用 StoreKit 2 实现内购;了解 iOS 18.4 新增字段(如 appTransactionID、offerPeriod 等);查询 API 签名与参数;规划订阅架构;排查交易问题;实现 StoreKit Views;与 App Store Server API 集成。
支持的产品类型
- 消耗型(Consumable):可多次购买,例如金币、提示、临时加成;不随新设备恢复。
- 非消耗型(Non-Consumable):一次购买永久拥有,例如高级功能、关卡包、去广告;必须随新设备恢复。
- 自动续期订阅(Auto-Renewable Subscription):自动续期,归入订阅组;必须随新设备恢复;支持免费试用、引导优惠、促销优惠、挽回优惠。
- 非续期订阅(Non-Renewing Subscription):固定时长、不自动续期,例如季节通行证;必须随新设备恢复。
相较 StoreKit 1 的关键改进
采用 Async/Await 现代并发,替代 delegate/closure;内置 JSON Web Signature(JWS)自动验证;使用强类型 Transaction 替代 SKPaymentTransaction;可通过 StoreKit 配置文件做本地测试;提供 SwiftUI 预置购买界面(ProductView、SubscriptionStoreView);提供 App Store Server API 与 Server Notifications。
主要 API 能力
Product
代表 App Store Connect 或 StoreKit 配置文件中配置的内购项目。可通过 Product.products(for:) 批量加载产品,并检查未加载的 ID。属性包括 id、displayName、description、displayPrice、price、type。订阅专属信息通过 product.subscription 获取,包含 subscriptionGroupID、subscriptionPeriod、introductoryOffer(免费试用/按周期折扣/一次性折扣)以及 promotionalOffers。
购买
product.purchase(confirmIn:)(iOS 18.2+)在指定场景中确认购买;支持 options,例如 .appAccountToken、.promotionalOffer(offerID:signature:)(JWS 格式签名)、.introductoryOfferEligibility(signature:)。SwiftUI 中可通过 @Environment(\.purchase) 调用。PurchaseResult 包含 .success(需验证并授予权益后 finish)、.userCancelled、.pending(如 Ask to Buy 或支付问题,后续通过 Transaction.updates 到达)。
Transaction
代表一次成功的内购。iOS 18.4 新增字段包括 appTransactionID、offer.period(ISO 8601 时长)、advancedCommerceInfo(仅 Advanced Commerce API 购买时存在)。属性包括 id、originalID、productID、productType、purchaseDate、appAccountToken,以及订阅的 expirationDate、isUpgraded、revocationDate、revocationReason,优惠的 type、id、paymentMode。可通过 Transaction.currentEntitlements 获取全部当前权益,通过 Transaction.currentEntitlements(for:)(iOS 18.4+,替代已废弃的 currentEntitlement(for:))获取指定产品权益,并可用 Transaction.all 与 Transaction.all(matching:) 查询历史。必须监听 Transaction.updates 处理实时更新(内购、App Store 促销内购、兑换码、续期、家庭共享、待处理购买完成、退款通知等),处理完成后调用 transaction.finish()。
验证
VerificationResult<Transaction> 分为 .verified(App Store 签名,可授予权益并 finish)与 .unverified(签名无效,不应授予权益,但仍需 finish 以清理队列)。验证检查交易由 App Store 签名、属于本应用(bundle ID 匹配)、属于本设备。
AppTransaction
代表应用最初下载,通过 AppTransaction.shared 获取。iOS 18.4 新增 appTransactionID(同一 Apple Account + 应用的全局唯一 ID,与 Transaction、RenewalInfo 中一致)与 originalPlatform(iOS、macOS、tvOS、visionOS;watchOS 下载显示为 .iOS)。属性还包括 appVersion、originalAppVersion、originalPurchaseDate、bundleID、deviceVerification、deviceVerificationNonce。可用于检查版本更新提示,以及从付费应用迁移到免费加内购时按原始购买日期授予高级访问。
RenewalInfo
提供自动续期订阅的续期状态。iOS 18.4 新增 appTransactionID、offerPeriod、appAccountToken、advancedCommerceInfo。属性包括 willAutoRenew、autoRenewPreference(用户续期到的产品 ID)、expirationReason(如 autoRenewDisabled、billingError、didNotConsentToPriceIncrease、productUnavailable、unknown)、gracePeriodExpirationDate(宽限期)、priceIncreaseStatus(.agreed、.notYetResponded)。
使用方式与限制
需导入 StoreKit,并在 App Store Connect 或 .storekit 配置文件中配置好产品 ID;购买需提供 UIWindowScene(iOS 18.2+);促销优惠与自定义引导资格需服务端提供 JWS 签名;transaction.finish() 必须调用,否则交易会在下次启动或 Transaction.updates 中重复投递并积累队列。文档还提及相关技能 axiom-in-app-purchases(测试优先工作流与架构模式),以及未来的 iap-auditor 与 iap-implementation 智能体,资料暂未提供这些项的详细信息。