restoreCompletedTransactions在沙箱环境中返回不完整的信息

DDR*_*r62 6 iphone in-app-purchase ios5

在开发iPhone应用程序时,我在restoreCompletedTransactions方面遇到了一些麻烦.在沙箱环境中工作时,会出现下面列出的所有问题.该应用尚未销售.它是在模拟器5.0和5.1中运行的Xcode 4.3.2开发的.我得到的问题是:

  1. 每次应用程序启动并调用addTransactionObserver时,都会调用updatedTransactions并购买一个事务.在每次回调时,我的代码调用finishTransaction:来完成购买,但每次启动应用程序时都会发生这个问题.确认购买完全相同的商品.
  2. 调用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]将不会列出随帐户购买的所有非消耗品.我有2次购买非消耗品,每次只返回1件.如果我尝试购买列表中缺少的项目,我将收到一条消息,表明该项目已被购买.列表中缺少的项目不是我遇到问题1(上面列出的).

此时我完全卡住了.我的应用程序依赖于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];
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*nio 0

您是否尝试在每次应用程序启动时调用restoreCompletedTransactions?如果您想要所有交易的列表,您可以发出 SKProductsRequest

 SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productsSet];
    productsRequest.delegate = self;
    [productsRequest start];
Run Code Online (Sandbox Code Playgroud)

如果您想获取已完成的交易但未取回所有内容,请显示日志。