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

StoreKit 2中autoRenewalPreference使用问题:无法获取下一个续订产品ID

解决Apple订阅中获取用户续订偏好(autoRenewalPreference)的问题

要获取用户选择的下一次续订产品ID,解决订阅升级/降级后当前订阅到期前无法显示正确产品的问题,可以通过两种方式实现:

方式一:使用StoreKit 2(推荐,iOS 15+)

StoreKit 2的AutoRenewableSubscription类型直接提供了autoRenewPreference属性,可直接获取用户设置的下一次续订产品ID。

代码示例(Swift)

import StoreKit

func fetchUserSubscriptionRenewalPreference() async {
    do {
        // 获取当前所有有效的订阅权益
        let currentEntitlements = try await Transaction.currentEntitlements
        
        for entitlement in currentEntitlements {
            // 筛选自动续订类型的订阅
            guard let autoRenewableSub = entitlement.autoRenewableSubscription else {
                continue
            }
            
            if let nextProductID = autoRenewableSub.autoRenewPreference {
                // 用户已设置续订偏好(升级/降级),下一次续订将使用该产品
                print("用户选择的下一次订阅产品ID:\(nextProductID)")
                // 更新UI展示用户选择的目标订阅
            } else {
                // 用户未修改续订偏好,下一次续订将沿用当前订阅产品
                print("下一次续订将沿用当前订阅:\(autoRenewableSub.productID)")
            }
        }
    } catch {
        print("获取订阅信息失败:\(error.localizedDescription)")
    }
}

方式二:传统收据验证(兼容低版本系统)

对于iOS 15以下的设备,需要解析App Store收据来获取auto_renewal_preference字段。生产环境建议通过服务器调用Apple的收据验证接口,避免本地解析的安全风险。

本地解析示例(仅用于演示)

import Foundation

func parseReceiptForRenewalPreference() {
    guard let receiptURL = Bundle.main.appStoreReceiptURL,
          FileManager.default.fileExists(atPath: receiptURL.path) else {
        print("未找到App Store收据文件")
        return
    }
    
    do {
        let receiptData = try Data(contentsOf: receiptURL)
        // 将收据转为Base64字符串,发送到服务器进行验证(生产环境必须这么做)
        let base64Receipt = receiptData.base64EncodedString()
        
        // 本地解析演示(不推荐生产环境使用)
        if let receiptJSON = try JSONSerialization.jsonObject(with: receiptData, options: []) as? [String: Any],
           let latestReceiptInfo = receiptJSON["latest_receipt_info"] as? [[String: Any]] {
            // 遍历收据中的订阅记录,查找包含auto_renewal_preference的条目
            for receiptEntry in latestReceiptInfo {
                if let renewalPref = receiptEntry["auto_renewal_preference"] as? String {
                    print("下一次续订产品ID:\(renewalPref)")
                }
            }
        }
    } catch {
        print("解析收据失败:\(error.localizedDescription)")
    }
}

注意事项

  • autoRenewPreference(或auto_renewal_preference字段)仅在用户主动修改了订阅续订偏好(升级、降级、切换订阅)时才会存在,否则为nil,此时下一次续订将沿用当前活跃的订阅产品。
  • StoreKit 2需要iOS 15.0+、macOS 12.0+、watchOS 8.0+、tvOS 15.0+系统版本,低版本设备需使用传统收据验证方式做兼容处理。
  • 生产环境中,务必通过服务器验证收据,不要依赖本地解析,避免被篡改风险。

内容的提问来源于stack exchange,提问作者Endre Olah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:30:09