StoreKit 2 中 autoRenewalPreference 的使用

问题描述 投票:0回答:1

我面临一个问题,我无法在代码中获取实际选择的订阅产品。 Apple 提供了一种获取 currentEntitlements 的简单方法,这提供了实际有效的订阅。

问题在于该方法不提供任何升级或降级信息。因此,如果用户降级订阅,他仍然会看到当前的活动订阅,直到订阅过期。一旦过期,该方法将提供正确的订阅产品。

理论上有一个值“autoRenewalPreference”,它应该告诉您下一个续订productid是什么。但我找不到如何获得这个。

有什么建议或代码吗?谢谢

storekit in-app-subscription auto-renewable
1个回答
0
投票

如上所述,问题开始于您希望向用户显示当前订阅期到期时将向哪些订阅服务收费的地方。通过 Transaction.currentEntitlements 请求,您只会获得实际运行的 ProductID,该 ID 可能不会更新。所以你需要知道下次要收费的金额。

Apple 文档并没有给出太多提示。

所以这是我的解决方案:

func updatePurchasedProducts() async {
    var differentID = ""
    for await result in Transaction.currentEntitlements {
        guard case .verified(let transaction) = result else {
            continue
        }

        do {
            let products = try await Product.products(for: [transaction.productID])
            for product in products {
                do {
                    let productSubInfo = try await product.subscription?.status
                    for subInfo in productSubInfo! {
                        switch subInfo.renewalInfo {
                        case .verified(let prodStatus):
                            if (prodStatus.autoRenewPreference == transaction.productID) {
                                NSLog("Product is the same")
                            } else {
                                NSLog("Product is different : \(String(describing: prodStatus.autoRenewPreference))")
                                differentID = prodStatus.autoRenewPreference!
                            }
                            break
                        default:
                            break
                        }
                    }
                } catch {
                        
                }
            }
        } catch {
            // do nothing
        }
        
        self.purchasedProductIDs.removeAll()
        if transaction.revocationDate == nil {
            if !expired(transaction: transaction) {
                if (differentID == "") {
                    self.purchasedProductIDs.insert(transaction.productID)
                }
                else {
                    self.purchasedProductIDs.removeAll()
                    self.purchasedProductIDs.insert(differentID)
                }
            } else {
                self.purchasedProductIDs.remove(transaction.productID)
            }
        } else {
            self.purchasedProductIDs.remove(transaction.productID)
        }
    }
    
    subscriptionsPurchased = !self.purchasedProductIDs.isEmpty
    NSLog("Subscription count: \(self.purchasedProductIDs.count)")
    NotificationCenter.default.post(name: Notification.Name("UpdateTabBar"), object: nil)
    formdelegate?.PurchaseUpdated()
}

正如你所看到的,事情并没有那么简单。所以稍微解释一下。

当您请求 Transaction.currentEntitlements 时,您将获得当前订阅的活动状态。 (和/或购买的产品。)就我而言,我有一个订阅组,有 3 个订阅期,我的应用内产品是消耗品。所以我只需要处理订阅降级和升级。实际上,降级会带来问题,因为它们仅在当前订阅期到期时才会激活。

如果是这种情况,Transaction.currentEntitlements将返回 2 个值,即活动值和下一个更新值。因此,当您迭代这些购买交易时,您需要检查您已返回的交易所涵盖的产品状态。

在产品中,如果是订阅,您可以一一查看订阅信息的续订状态。如果 autoRenewPreference 值(即产品 ID)与 currentEntitlements 中的产品 ID 不同,则表明用户已经更改了订阅计划。

最后,您应该确保正确的产品ID保存在某处,因为您需要以正确的方式向客户展示它。

我希望我可以帮助编写代码。

© www.soinside.com 2019 - 2024. All rights reserved.