我最近转换到StoreKit 2来处理我的应用程序中的活动订阅。但有些方面我不太确定。关于revocationDate和到期日期的文档我不清楚。
1.如果用户在7天试用中取消了他的 * 自动续订 *,撤销日期是否为非零?
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
}
2条答案
按热度按时间dbf7pr2w1#
1.如果自动续订订阅在试用期内被取消,则revocationDate将在试用期结束时设置,因为在此期间订阅在技术上不活动。
1.是,Transaction.currentEntitlements仅包括当前活动的产品。如果订阅过期或取消,则不会包含在返回的列表中,但对于非续订订阅,您可能需要检查过期日期,以确定用户是否有权使用订阅福利
1.大多数storekit方法和回调都是在主线程上自动执行的,所以是的建议在主线程中执行代码,这也将确保没有任何潜在的线程问题
rxztt3cl2#
revocationDate是App Store撤销交易的日期。这可能发生在用户获得购买退款或付款被发现欺诈时。在trail中,撤销不会被设置,revocationDate仍然为nil。
currentEntitlements将为您提供用户的所有权利,例如对内容的访问。然而,正当的权利并不意味着它的积极性。您仍然需要检查自动续订订阅的续订日期,以查看它们是否处于活动状态。
您可以使用@MainActor属性来确保网络调用不会冻结Ui。