【发布时间】:2014-11-30 14:49:45
【问题描述】:
我正在尝试执行以下操作;
获取以前的购买,但只加载到用户选择的支付队列中。我不希望用户下载多个恢复的购买。 Apple 建议允许用户决定要恢复的内容,这就是我遇到的问题。
目前,我允许在用户选择恢复时调用RestoreCompletedTransactions,但这意味着我必须清除所选的支付队列。这似乎是一个不必要的过程,导致的问题多于解决的问题。我确信有一种简单的方法可以做到这一点,但我已经在网上搜索了几个小时以寻找解决方案,Apple 文档并没有为此提供任何合理的程序。如果有人可以在这里给我一些指导,我将不胜感激。
我购买的这些非消耗品工作正常,只是恢复让我陷入困境。
顺便说一句 - 它的 Apple 托管内容!
- (IBAction)buyProduct:(id)sender { //checked!!
NSLog(@"Performing in-app purchase: %@",_product);
SKPayment *payment = [SKPayment paymentWithProduct:_product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (IBAction)Restore:(id)sender {
NSLog(@"Performing in-app restore_product: %@",_product);
NSLog(@"Performing in-app restore_productID: %@",productID);
[self restoreThePurchase];
}
- (BOOL)restoreThePurchase {
// restore the purchase
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];
return YES;
}
#pragma mark -
#pragma mark SKPaymentTransactionObserver methods
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased: {
NSLog(@"Transaction State Purchased");
[[SKPaymentQueue defaultQueue] startDownloads:transaction.downloads];
[self completeTransaction:transaction];
break;
}
case SKPaymentTransactionStateFailed: {
// transaction didn't work
[self displayAlertViewWithMessage:@"There was a problem with your purchase. Please try again later."];
break;
}
case SKPaymentTransactionStateRestored: {
// purchase has been restored
transactionRestored = [[NSMutableArray alloc] init];
NSLog(@"received restored transactions: %lu", (unsigned long)queue.transactions.count);
for (SKPaymentTransaction *transaction in queue.transactions)
{
{
NSString *aProductID = transaction.payment.productIdentifier;
[transactionRestored addObject:aProductID];
}
NSLog(@"TransactionRestoredArray in PQRCTF : %@", transactionRestored);
NSLog(@"Restore indentifier in PQRCTF : %@", transaction.payment.productIdentifier);
NSLog(@"ProductID in PQRCTF : %@", productID);
NSLog(@"Transaction in PQRCTF : %@", transaction);
NSLog(@"OrignianalTransaction in PQRCTF : %@", transaction.originalTransaction);
NSLog(@"OrignianalTransaction in PQRCTF : %@", transaction.payment.productIdentifier);
if ([transactionRestored containsObject:productID]) {
NSLog(@"Was purchased before!in PQRCTF");
//[self restoreTransaction:transaction];
} else {
[[SKPaymentQueue defaultQueue]finishTransaction:transaction];
}
break;
}
case SKPaymentTransactionStatePurchasing: {
// currently purchasing
break;
}
default:
break;
}
}
}
}
【问题讨论】:
-
也许您应该使用新的 iTunes Connect 用户进行测试。您的恢复似乎正在恢复重复的事务
-
就是这样。我想允许用户只选择一个事务来恢复,而不是全部恢复。如何强制 RestoreCompletedTransactions 仅将选定产品加载到付款队列中,而不是全部加载?
-
您是在生产环境中还是在开发环境中进行测试?
-
因为如果您正在使用 iTunes Connect 用户进行开发测试,那么您有多个购买链接到该用户。创建一个新用户并重新测试。在生产中你不会有场景
-
感谢您的快速回复。我今晚试试然后回来!
标签: ios in-app-purchase