调用 SKRestoreCompletedTransactions 恢复所有事务

Sla*_*ast 1 in-app-purchase ios

我正在尝试执行以下操作;

获取之前的购买,但只加载到用户选择的支付队列中。我不希望用户下载多个恢复的购买。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;
    }
}
}
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*sko 8

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

目前,无法清除来自测试用户的购买。这意味着最好的办法是创建一个具有特定配置的新测试用户:在这种情况下,该配置是用户购买了具有特定标识符的产品。您可以使用特定的产品标识符命名您的测试用户,以便更直接地了解尝试与该用户进行购买的新用户。

因此,设置一个新用户并再次测试您的代码。