如何在 iOS 中恢复非消耗品的 IAP

how to Restore IAP for non-consumable product in iOS

我想知道 是否必须将两个按钮分开,一个用于升级,另一个用于还原以恢复以前的交易??

我自己应该采取什么步骤来避免App for Restore交易被拒绝的机会。

我使用以下代码恢复非消耗性应用内购买。 如果以下代码有任何更改,请告诉我。

- (void)buyProduct:(SKProduct *)product {

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        //[[SKPaymentQueue defaultQueue] addPayment:payment];
        [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{

    for (SKPaymentTransaction * transaction in transactions) {

        switch (transaction.transactionState)
        {
                // Call the appropriate custom method for the transaction state.
            case SKPaymentTransactionStatePurchasing:
                [self showTransactionAsInProgress:transaction deferred:NO];
                break;
            case SKPaymentTransactionStateDeferred:
                [self showTransactionAsInProgress:transaction deferred:YES];
                break;
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                // For debugging
                NSLog(@"Unexpected transaction state %@", @(transaction.transactionState));
                break;
        }
    };


}

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
    NSLog(@"Restore Completed Transactions Failed WithError...%@",error);
    [self failedMessage:@"Restore Completed Transactions Failed"];
    [self stopIndicator];
}

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
    NSMutableArray *arrPurchasedItemIDs = [[NSMutableArray alloc] init];
    for (SKPaymentTransaction *transaction in queue.transactions)
    {
        NSString *productID = transaction.payment.productIdentifier;

        [arrPurchasedItemIDs addObject:productID];

        NSLog(@"arrPurchasedItemIDs : %@",arrPurchasedItemIDs);
    }

    NSLog(@"Restore Completed");
    [self completeMessage:@"Restore Completed"];
    [self stopIndicator];
}

在这里你可以如何分离恢复购买代码:

-(void)doClickRestore {
    [APP_DEL doStartSpinner];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
    for (SKPaymentTransaction *transaction in transactions) {
        switch (transaction.transactionState) {
                // Purchase success Transaction
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
                // Purchase fail Transaction
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
            {
                [self doStopSpinner];
                [self restoreTransaction:transaction];
            }
            default:
                break;
        }
    }
}

- (void) restoreTransaction: (SKPaymentTransaction *)transaction {
    [self doStopSpinner];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

注:

点击恢复购买将恢复所有已购买的非消耗性应用内购买

希望对您有所帮助。

下面这两个方法是可选的,但如果你愿意,你可以使用它。

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 


- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue