我正在使用
恢复已完成的交易(重复出现)[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
并在
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
我得到了应用程序恢复的历史记录事务列表,但方法是:
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
甚至没有被调用一次,所以我想知道我应该使用哪一个?我做了一些研究,发现updatedTransactions:
方法应该用于检查事务状态,但是如果我得到了一个恢复的事务列表,那么将它们全部视为事务就没有意义了。我应该使用哪一个? paymentQueueRestoreCompletedTransactionsFinished
仅向我提供最新版本(即沙盒订阅在几分钟后到期,我在updatedTransactions
)中获得了测试时完成的历史记录事务列表。
答案 0 :(得分:9)
有一个关于使用StoreKit的优秀WWDC视频,它是WWDC2012 Session 302。
要隔离每次购买,您的updatedTransactions
方法可能如下所示:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch(transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
// Unlock content
//... Don't forget to call `finishTransaction`!
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStatePurchasing:
// Maybe show a progress bar?
break;
case SKPaymentTransactionStateFailed:
// Handle error
// You must call finishTransaction here too!
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
// This is the one you want ;)
// ...Re-unlock content...
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
}
}
一旦确定正在恢复购买,您可以根据需要提供内容 - 最好通过从该switch语句中调用单独的方法并将事务作为参数传递。当然,实施取决于你。
答案 1 :(得分:2)
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]
中的(void)viewDidLoad
或同等身份。[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
。(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
将通过(2)进行相应调用。如果你没有调用(1)中的方法,应用程序将永远不会达到(3)首先恢复交易。
答案 2 :(得分:0)
我也遇到了同样的问题,paymentQueueRestoreCompletedTransactionsFinished从未被调用过。我通过在“设置”中的iTunes&Aoo Stores进行修复,并退出了沙盒测试帐户,然后再次尝试。在提示您再次登录以还原后,下一次按预期方式工作。
答案 3 :(得分:-1)
来自Apple文档:
paymentQueueRestoreCompletedTransactionsFinished:此方法称为 付款完成所有可恢复的交易后 队列。您的应用程序无需使用此方法做任何事情。