swift 如何正确使用StoreKit 2处理自动更新?

frebpwbc  于 2023-10-15  发布在  Swift
关注(0)|答案(2)|浏览(303)

我最近转换到StoreKit 2来处理我的应用程序中的活动订阅。但有些方面我不太确定。关于revocationDate和到期日期的文档我不清楚。
1.如果用户在7天试用中取消了他的 * 自动续订 *,撤销日期是否为非零?

  1. Transaction.currentEntitlements是否仅包含当前活动的产品?我假设我真的不需要检查expirationDate是否过期,如果是这样的话。
    1.是否建议在MainThread中执行此代码?
    以下是完整的方法:
@MainActor
    func syncActiveAppleProduct() async {
        LoggerManager.shared.warning("[Fetch Current Entitlements]")
        
        var activeSubscriptions: [Product] = []

        for await result in Transaction.currentEntitlements {
            do {

                let transaction = try checkVerified(result)
                
                guard let subscription: Product = subscriptions.first(where: { $0.id == transaction.productID }) else {
                    continue
                }
                
                switch transaction.productType {
                case .autoRenewable:
                    guard transaction.revocationDate == nil else { continue }

                    if let expirationDate = transaction.expirationDate {
                        KeychainHelper.Subscription.setExpiryOrCancelledDate(expirationDate)
                    }
                    activeSubscriptions.append(subscription)
                    
                case .consumable, .nonConsumable, .nonRenewable:
                    guard let expirationDate = getNonRenewingExpirationDate(forProductId: transaction.productID, purchaseDate: transaction.purchaseDate) else { continue }
                    if Date() < expirationDate {
                        KeychainHelper.Subscription.setExpiryOrCancelledDate(expirationDate)
                        activeSubscriptions.append(subscription)
                    }
                default:
                    continue
                }
                
            } catch let error {
                LoggerManager.shared.error(error: error, message: "Failed update active customer product.")
            }
        }

        self.activeSubscriptions = activeSubscriptions
    }
dbf7pr2w

dbf7pr2w1#

1.如果自动续订订阅在试用期内被取消,则revocationDate将在试用期结束时设置,因为在此期间订阅在技术上不活动。
1.是,Transaction.currentEntitlements仅包括当前活动的产品。如果订阅过期或取消,则不会包含在返回的列表中,但对于非续订订阅,您可能需要检查过期日期,以确定用户是否有权使用订阅福利
1.大多数storekit方法和回调都是在主线程上自动执行的,所以是的建议在主线程中执行代码,这也将确保没有任何潜在的线程问题

rxztt3cl

rxztt3cl2#

revocationDate是App Store撤销交易的日期。这可能发生在用户获得购买退款或付款被发现欺诈时。在trail中,撤销不会被设置,revocationDate仍然为nil。
currentEntitlements将为您提供用户的所有权利,例如对内容的访问。然而,正当的权利并不意味着它的积极性。您仍然需要检查自动续订订阅的续订日期,以查看它们是否处于活动状态。
您可以使用@MainActor属性来确保网络调用不会冻结Ui。

相关问题