在开发iPhone应用程序时,我遇到了很多关于restoreCompletedTransactions的问题。在沙箱环境中工作时,会出现下面列出的所有问题。该应用尚未销售。它是在模拟器5.0和5.1中运行的Xcode 4.3.2开发的。我得到的问题是:
此时我完全卡住了。我的应用程序依赖于AppStore来返回非耗材的信息,因为我们没有将这些数据保存在我们自己的服务器中。但我们需要确保AppStoreKit返回包含所有购买项目的列表。不只是一些。
以下是我用来测试restoreCompletedTransactions的相关代码:
- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"updatedTransactions started. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
NSLog(@"Number of transactions received: %d.", [transactions count]);
int count = 0;
for (SKPaymentTransaction *trans in transactions)
{
NSLog(@"Data for transaction %d: ", ++count);
NSString *transId = [trans transactionIdentifier];
switch ([trans transactionState])
{
case SKPaymentTransactionStatePurchasing:
NSLog(@"Purchasing transaction: %@", transId);
if (transId == nil)
{
NSLog(@" Original transaction Id: %@", [[trans originalTransaction] transactionIdentifier]);
}
NSLog(@" No action taken in update");
break;
case SKPaymentTransactionStateFailed:
NSLog(@"Purchase transaction failed for transaction %@", transId);
NSLog(@" Error %d (%@)", [[trans error] code], [[trans error] localizedDescription]);
NSLog(@" Action Taken: finish transaction.");
[queue finishTransaction: trans];
break;
case SKPaymentTransactionStatePurchased:
NSLog(@"Purchased transaction %@", transId);
NSLog(@" Purchased qty %d of product %@", [[trans payment] quantity], [[trans payment] productIdentifier]);
NSLog(@" Action: called [queue finishTransaction:] to complete purchase");
[queue finishTransaction: trans];
break;
case SKPaymentTransactionStateRestored:
{
SKPayment *paym = [trans payment];
SKPaymentTransaction *origTrans = [trans originalTransaction];
SKPayment *origPayment = [[trans originalTransaction] payment];
NSLog(@"Transaction restored: %@ with original transaction %@", transId, [[trans originalTransaction] transactionIdentifier]);
NSLog(@" TRANSACTION DATA:");
NSLog(@" purchased %d of product %@ on %@.",
[paym quantity],
[paym productIdentifier],
[[trans transactionDate] description]);
NSLog(@" ORIGINAL TRANSACTION DATA:");
NSLog(@" purchased %d of product %@ on %@.",
[origPayment quantity],
[origPayment productIdentifier],
[[origTrans transactionDate] description]);
NSLog(@" No action taken.");
break;
}
default:
NSLog(@"Unexpected transaction state: %d", [trans transactionState]);
NSLog(@" No action taken.");
break;
}
}
NSLog(@"");
NSLog(@"updatedTransactions ended. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
}
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"Restore completed transactions finished.");
NSLog(@" Number of transactions in queue: %d", [[queue transactions] count]);
for (SKPaymentTransaction *trans in [queue transactions])
{
NSLog(@" transaction id %@ for product %@.", [trans transactionIdentifier], [[trans payment] productIdentifier]);
NSLog(@" original transaction id: %@ for product %@.", [[trans originalTransaction] transactionIdentifier],
[[[trans originalTransaction] payment]productIdentifier]);
}
NSLog(@"");
}
// Method to restore transactions when user clicks button in application
- (void) onRestoreCompletedTransactions:(id)sender
{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
答案 0 :(得分:0)
每次应用程序启动时,您是否尝试调用restoreCompletedTransactions?如果您想要所有交易的列表,您将进行SKProductsRequest
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productsSet];
productsRequest.delegate = self;
[productsRequest start];
如果你想获得completedTransactions并且没有收回所有内容,请显示日志。
答案 1 :(得分:0)
SKProductsRequest将返回SKProduct实例列表。 SKProduct类不会在我的阅读中购买信息。我想你确实想要使用restoreCompletedTransactions并获取SKPaymentTransaction实例的列表。也就是说,我在使用沙盒帐户时遇到了同样的问题。我找回了一份不完整的交易清单(48个中的23个)。但是,如果我选择购买已购买但未恢复的非消耗品,那么该商店是已购买的商品,并将发回该商品的恢复。
运气好吗?