You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自动续订订阅免费试用申请及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:27:01