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

如何在RevenueCat中获取产品的trialDuration并动态展示试用时长

解决RevenueCat展示订阅试用时长的问题

核心实现步骤

你需要先从Offering中筛选出目标年度订阅的Package,再提取试用周期并格式化为用户易懂的本地化文本,具体代码如下:

代码示例

  1. 定位年度订阅Package
    从已获取的offering中筛选出年度订阅对应的Package,可通过产品ID或订阅周期两种方式判断:
// 方式1:通过产品ID筛选(替换为你的年度订阅产品ID)
let annualProductId = "com.your.app.annual.subscription"
if let offering = offering, 
   let annualPackage = offering.packages.first(where: { 
       $0.product.productIdentifier == annualProductId 
   }) {
    handleTrialDuration(for: annualPackage)
}

// 方式2:通过订阅周期筛选(无需硬编码产品ID)
if let offering = offering,
   let annualPackage = offering.packages.first(where: {
       $0.product.subscriptionPeriod?.unit == .year && 
       $0.product.subscriptionPeriod?.numberOfUnits == 1
   }) {
    handleTrialDuration(for: annualPackage)
}
  1. 提取并格式化试用时长
    编写方法将订阅周期对象转换为本地化文本,展示到标签上:
private func handleTrialDuration(for package: Package) {
    guard let trialPeriod = package.freeTrialPeriod else {
        // 无免费试用时的文案
        trialLabel.text = "无免费试用"
        return
    }
    
    let localizedTrialText = formatSubscriptionPeriod(trialPeriod)
    trialLabel.text = "免费试用:\(localizedTrialText)"
}

private func formatSubscriptionPeriod(_ period: SKProductSubscriptionPeriod) -> String {
    let unitString: String
    let unitCount = period.numberOfUnits
    
    switch period.unit {
    case .day:
        unitString = unitCount == 1 ? "天" : "天"
    case .week:
        unitString = unitCount == 1 ? "周" : "周"
    case .month:
        unitString = unitCount == 1 ? "个月" : "个月"
    case .year:
        unitString = unitCount == 1 ? "年" : "年"
    @unknown default:
        unitString = ""
    }
    
    return "\(unitCount)\(unitString)"
}

关键说明

  • Package.freeTrialPeriod仅在产品配置了免费试用时才有值,无试用时需处理空值场景
  • 格式化方法会根据周期单位和数量生成自然的本地化文本,适配单复数表述

内容的提问来源于stack exchange,提问作者Mc.Lover

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:45:44