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
相关产品推荐
相关产品推荐

