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

时间:2012-05-14 17:28:02

标签: iphone ios5 in-app-purchase

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

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

2 个答案:

答案 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个)。但是,如果我选择购买已购买但未恢复的非消耗品,那么该商店是已购买的商品,并将发回该商品的恢复。

运气好吗?