【发布时间】:2020-12-01 08:58:42
【问题描述】:
我有一个带有订阅(非续订)的 iOS 应用(目标 C)。 当用户重新启动应用时,如何检查它是否仍然处于活动状态?
我已经阅读了很多关于此的内容,但答案似乎不清楚如何正确地做到这一点。
我目前拥有的是当应用程序启动时我注册了 TransactionObserver,
IAPManager* iapManager = [[IAPManager alloc] init];
[[SKPaymentQueue defaultQueue] addTransactionObserver: iapManager];
那么当用户购买我拥有的商品时,
- (void) paymentQueue: (SKPaymentQueue *)queue updatedTransactions: (NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
[self showTransactionAsInProgress:transaction deferred:NO];
break;
case SKPaymentTransactionStateDeferred:
[self showTransactionAsInProgress:transaction deferred:YES];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
[queue finishTransaction: transaction];
break;
case SKPaymentTransactionStatePurchased:
[self persistPurchase: transaction];
[queue finishTransaction: transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
[queue finishTransaction: transaction];stopBusy];
break;
default:
break;
}
}
}
因此,当用户首次订阅时,这可以正常工作。 但我对您应该如何存储/跟踪此购买感到困惑。我存储在用户订阅的静态变量中以启用应用程序功能,但是当用户重新启动应用程序时,我应该如何检查他们是否有活动订阅?
我使用的代码是将订阅存储在 iCloud 或 NSUserDefaults 中。 存储在 iCloud 中根本不起作用,当他们重新启动应用程序时,他们失去了订阅。存储在 NSUserDefaults 中有效,但订阅最终会过期,并且可以退款或取消。如何检查它是否处于活动状态?我可以存储订阅日期并假设持续时间并尝试检查自己,但这似乎非常错误。
如果用户卸载应用程序并重新安装,或者得到一部新手机/等,该怎么办。
- (void) persistPurchase: (SKPaymentTransaction*) transaction {
#if USE_ICLOUD_STORAGE
NSUbiquitousKeyValueStore *storage = [NSUbiquitousKeyValueStore defaultStore];
#else
NSUserDefaults *storage = [NSUserDefaults standardUserDefaults];
#endif
if ([transaction.payment.productIdentifier isEqualToString: SUBSCRIPTION]) {
[storage setBool: true forKey: SUBSCRIPTION];
[IAPManager upgrade];
}
[storage synchronize];
[self unlockPurchase: transaction];
}
为此,我认为我需要调用 restoreCompletedTransactions。我认为不将订阅存储在 NSUserDefaults 中,而是在每次应用启动时调用 restoreCompletedTransactions 是有意义的。
但从我读到的内容来看,Apple 似乎希望您有一个“恢复购买”按钮来执行此操作?每次应用程序启动时调用它是否有意义? 这将在您处理过的每笔付款(我认为??)中调用这些付款中的每笔付款如何知道它们是否仍然有效?
我可以获得交易日期,但这并不能告诉我付款是否过期,除非我假设它没有被取消并假设持续时间并自己检查日期?还是 Apple 只为您提供来自 restoreCompletedTransactions 的有效订阅/付款?
我还需要再次调用 finishTransaction 进行恢复吗?
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
【问题讨论】:
-
Sebastians 和我的回答都不正确有什么原因吗?这两个答案都直接来自 Apple 文档。
标签: ios objective-c in-app-purchase in-app-subscription