【问题标题】:Calling SKRestoreCompletedTransactions restores all transactions调用 SKRestoreCompletedTransactions 恢复所有事务
【发布时间】: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


【解决方案1】:

我怀疑您正在使用重复购买的 iTunes Connect 测试用户进行测试。这个问题永远不会在生产中发生,但在测试期间会困扰很多开发人员。原因是您可以针对测试用户多次购买相同的产品,并且这些购买将添加到测试用户帐户中,当您尝试恢复时,所做的每一次购买都将被恢复,从而使您的应用陷入困境。

目前有no way to clear purchases from a Test User。这意味着您最好的选择是创建具有特定配置的新测试用户:在这种情况下,该配置将是用户购买了具有特定标识符的产品。您可以使用特定的产品标识符命名您的测试用户,以便更直接地与尝试与该用户一起购买的新用户。

所以设置一个新用户并再次测试您的代码。

【讨论】:

  • 感谢丹尼尔您的建议帮助!我也有未决的下载。当我从沙盒测试用户中删除该用户时,重置测试 iPhone,并创建一个新用户,购买和恢复似乎运行良好。我有另一个问题,所以我会重新发布,但再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多