StoreKit: ловить не удалось восстановить? - PullRequest
10 голосов
/ 13 октября 2011

Я реализую функцию покупки в приложении с помощью кнопки Восстановить .

У меня есть новый тестовый пользователь , без каких-либо платежей.

Когда я нажимаю кнопку восстановления и регистрируюсь с новым тестовым пользователем, я не могу перехватить никакие делегированные методы, которые сообщают мне, что транзакция восстановления завершилась неудачно (так как восстановить нечего).

Единственный вызываемый метод - это -(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue*)queue, но этот метод вызывается в том случае, если восстановление также было успешным.

Что я могу сделать сейчас? Как я могу поймать такой случай?


Дополнение: у меня есть индикатор прогресса, который говорит "Обращение в App Store", и мне нужен вызов, где я могу скрыть его и в неудачных случаях.

Ответы [ 3 ]

8 голосов
/ 11 января 2013

Ной: вот фрагмент кода для вас:

-(void)restore {

    [self.delegate showLoadingScreen];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];


}

И следующий метод:

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

    if (!queue.transactions || [queue.transactions count] == 0) {

        [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."];

    } else {

        BOOL didRestore = NO;

        for (SKPaymentTransaction *t in queue.transactions) {

            if (t.transactionState == SKPaymentTransactionStateRestored || t.transactionState == SKPaymentTransactionStatePurchased) {

                NSTimeInterval now = [[NSDate date] timeIntervalSince1970] - _timeOffset;
                NSTimeInterval expire = [t.transactionDate timeIntervalSince1970] + kExplorerSubscriptionSecondLength;
                NSTimeInterval purchase = [t.transactionDate timeIntervalSince1970];

                if (purchase <= now && now <= expire) {

                    didRestore = YES;
                }

            }


        }

        if (!didRestore)
            [self showAlertScreenWithTitle:@"Error Restoring Subscription" message:@"No subscription was found to restore."];

    }    

    [self.delegate dismissLoadingScreen];

}

Дайте мне знать, поможет ли это вам ...

1 голос
/ 09 января 2013

При восстановлении транзакции существует два делегированных метода:

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

Первый ( paymentQueueRestoreCompletedTransactionsFinished ) вызывается при восстановлении всех транзакций. Если у вас нет предыдущей покупки, он также вызывает этот метод, потому что восстановленный работал нормально, но восстановить нечего.

Другой метод ( restoreCompletedTransactionsFailedWithError ) вызывается при ошибке восстановления транзакции.

Если вам нужно показать пользователю сообщение о том, что у него нет транзакции для восстановления, вы можете использовать:

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

Здесь у вас есть небольшой фрагмент для этого делегата:

//
// called when the transaction status is updated
//
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
                restoredTransaction++;
                break;
            default:
                break;
        }
    }
}

Затем вы можете использовать переменную restoreTransaction , чтобы узнать, была ли восстановлена ​​какая-либо транзакция в paymentQueueRestoreCompletedTransactionsFinished

0 голосов
/ 10 января 2013

Вы можете использовать следующий метод делегата для восстановления транзакции.

 -(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error{
NSLog(@"Error when purchasing: %@",error);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...