首页 文章

恢复应用内购买错误:即使未购买也会恢复

提问于
浏览
3

一位(诚实)用户刚刚告诉我,即使没有购买应用程序内购买,也可以通过简单地按下RESTORE按钮来“购买”应用程序内购买我的应用程序 . 这是我正在使用的代码(我认为这已经足够......但我错了):

- (IBAction) restore {

            [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
            [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    }


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

    for (SKPaymentTransaction *transaction in transactions) {

        switch(transaction.transactionState){

            case SKPaymentTransactionStatePurchasing:

                NSLog(@"Transaction state -> Purchasing ...");

                break;

            case SKPaymentTransactionStatePurchased:

                NSLog(@"Transaction state -> Purchased");

                [self activatePurchase];

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                break;

            case SKPaymentTransactionStateRestored:

                NSLog(@"Transaction state -> Restored");

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];


                break;

            case SKPaymentTransactionStateFailed:

                NSLog(@"Transaction state -> Cancelled");

                if(transaction.error.code == SKErrorPaymentCancelled) {

                    //the user cancelled the payment ;(
                }

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

                break;

            case SKPaymentTransactionStateDeferred:

                NSLog(@"Transaction state -> Deferred");

                break;
        }
    }
}




- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {

    [self activatePurchase];

}

有什么东西我不见了吗?

1 回答

  • 1

    付款观察员方法 paymentQueueRestoreCompletedTransactionsFinished 在支付队列完成恢复交易时被调用,无论是否实际恢复了任何交易 . 每次调用 restoreCompletedTransactions 时,即使有0次调用 updatedTransactions ,也会调用 paymentQueueRestoreCompletedTransactionsFinished .

    因此,即使没有购买,您也会拨打 activatePurchase .

    激活购买的正确位置在 updateTransactionsSKPaymentTransactionStateRestored 中;就像你为 SKPaymentTransactionStatePurchased 案一样 .

相关问题