自动续订订阅免费试用申请及Swift(SwiftyStoreKit)实现与状态查询
关于自动续订订阅免费试用的问题解答
嘿,我来帮你捋清楚这两个问题的解决方案:
一、申请自动续订订阅免费试用的操作流程
这个流程主要在App Store Connect里完成,步骤很清晰:
- 登录你的App Store Connect账号,找到对应的App项目
- 进入「功能」标签页,点击「App内购买项目」选项
- 点击右上角的「添加」按钮,选择「自动续订订阅」类型;如果还没创建订阅组,得先新建一个订阅组再添加订阅产品
- 在订阅产品的配置页面,找到「定价与可用性」板块,这里就能设置免费试用了:
- 选择你想要的试用时长(比如3天、7天、1个月等,系统会自动过滤掉当前地区不支持的选项)
- 确认其他信息(比如定价、地区可用性)无误后,点击「存储」,然后提交审核
- 等苹果审核通过后,这个免费试用就会生效啦
二、Swift中用SwiftyStoreKit配置免费试用并检测试用周期
1. 配置免费试用
其实客户端不需要额外做特殊配置,因为免费试用的规则是你在App Store Connect里已经设置好的。客户端只需要正常请求对应的订阅产品ID,就能获取到包含试用信息的产品数据:
import SwiftyStoreKit func fetchSubscriptionProductInfo() { // 替换成你的自动续订订阅产品ID let targetProductIds = Set(["com.yourapp.premium_monthly"]) SwiftyStoreKit.retrieveProductsInfo(targetProductIds) { result in if let targetProduct = result.retrievedProducts.first { // 可以获取到免费试用的相关信息 if let introPrice = targetProduct.introductoryPrice { print("免费试用价格:\(introPrice.price),时长:\(introPrice.subscriptionPeriod)") } } else if let error = result.error { print("获取产品信息失败:\(error.localizedDescription)") } } }
2. 检测是否处于免费试用周期
要判断用户当前是否在免费试用阶段,最准确的方式是验证App Store的收据,从收据数据里提取试用状态。用SwiftyStoreKit可以这样实现:
func checkFreeTrialStatus() { // 替换成你的App内购买项目共享密钥,在App Store Connect的「用户与访问」>「密钥」里生成 let sharedSecret = "your_app_shared_secret_here" let validator = AppleReceiptValidator(service: .production, sharedSecret: sharedSecret) SwiftyStoreKit.verifyReceipt(using: validator) { receiptResult in switch receiptResult { case .success(let receipt): let targetProductId = "com.yourapp.premium_monthly" // 验证自动续订订阅状态 let subscriptionResult = SwiftyStoreKit.verifySubscription( ofType: .autoRenewable, productId: targetProductId, inReceipt: receipt ) switch subscriptionResult { case .purchased(_, let receiptItems): // 取最新的收据条目判断试用状态 if let latestItem = receiptItems.last { let isInTrial = latestItem.isTrialPeriod print("当前是否处于免费试用:\(isInTrial)") // 这里可以根据结果做对应的业务逻辑处理 } case .expired: print("订阅已过期,不在试用周期") case .notPurchased: print("用户未购买该订阅") } case .error(let error): print("收据验证失败:\(error.localizedDescription)") // 测试环境下记得把service改成.sandbox,避免验证失败 } } }
注意事项
- 测试环境中,一定要把
AppleReceiptValidator的service参数改成.sandbox,否则会验证失败 - 共享密钥要妥善保管,不要硬编码到客户端(可以考虑从后端获取,或者用安全的方式存储)
isTrialPeriod是收据里的原生字段,直接反映当前订阅的试用状态,是最可靠的判断依据
内容的提问来源于stack exchange,提问作者phani7Dev
相关产品推荐
相关产品推荐

