Не удалось завершить незавершенные транзакции в очереди платежей

Мое приложение перешло в нечетное состояние в песочнице IAP... Каждый раз, когда я запускаю приложение, он запрашивает пароль конкретного пользователя теста. Думаю, из-за незаконченной сделки. Я действительно хочу закончить эту транзакцию, но это невозможно. Некоторая фоновая информация и то, что я сделал для нее:

  • Я удалил этого тестового пользователя из itunesconnect
  • Как только приложение запускается, я вызываю [[SKPaymentQueue defaultQueue] addTransactionObserver:self]
  • Уведомление об обновлении очереди платежей не будет получено после ввода пароля для этого конкретного пользователя теста или отмены отмены
  • [SKPaymentQueue defaultQueue].transactions.count всегда 0, поэтому я не могу вручную завершить незавершенные транзакции
  • Я удаляю приложение с устройства, перезагруженное устройство - все еще запрашиваю пароль
  • Я выхожу из системы из настроек → iTunes и App Store
  • После того, как я отменил диалоговое окно с запросом пароля, я как-то могу войти в систему с другим тестовым пользователем, но в следующий раз я все еще получаю диалоговое окно для пароля старого тестового пользователя.

Остается только изменить идентификатор пакета, что нежелательно в моем случае. Надеюсь, кто-то знает альтернативные способы, как избавиться от незавершенных транзакций.

Ответ 1

Я помещаю это здесь, потому что есть много действительно плохих, плохих ответов, которые предоставляют НЕПРАВИЛЬНУЮ информацию о том, как решить эту проблему. Это не так уж редко, или загадочно или ошибка Apple, это часть дизайна магазина приложений, и там, чтобы помочь вам правильно настроить IAP.

НЕ НЕ:

  • Когда-либо, когда-либо, удаляйте пользователя тестовой программы. Это делает невозможным решение проблемы, и вы окажетесь в бесконечном цикле до тех пор, пока транзакция не исчезнет... она уходит, но требуется много времени, например, дни или недели.
  • Если вы удалите пользователя тестовой программы sandbox, когда вы впоследствии будете повторно предложены (например, КАЖДЫЙ раз, приложение устанавливает IAP), чтобы войти в учетную запись хранилища тестового пользователя на завершить транзакцию, t, поскольку пользователь был удален. Вы также не сможете добавить тестового пользователя, потому что портал разработчика скажет, что идентификатор пользователя уже имеет .
  • Не выполнять: удалить приложение или переустановить iOS или любую другую такую ​​BS. Это не влияет, не решает проблему и тратит много времени.

DO:

  • Вызов FINISH во всех транзакциях. Если кто-то прерван по какой-то причине, просто заполните его при следующем запуске приложения. Приложение будет повторно отправлено уведомление о очереди платежа, пока вы не назовете его окончанием, предоставив вам возможность позвонить [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; Это намеренно и предостережение от прерванных транзакций.

Что это! Завершите все транзакции, иначе вы будете отправлены в Endless Loop ад повторных запросов, чтобы войти в несуществующую учетную запись App Store пользователя каждый раз, когда ваше приложение запускается на этом устройстве: (

Ответ 2

Возможно, вам придется несколько раз повторить эти шаги, чтобы работать. Завершите транзакцию сразу после вызова метода делегирования наблюдателя транзакций.

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{    
    for (SKPaymentTransaction *transaction in transactions) {

        // Temporary code to solve the loop issue
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

        /*
        switch (transaction.transactionState) {
        // Call the appropriate custom method.
        case SKPaymentTransactionStatePurchased:
            [self completeTransaction:transaction];
            break;
        case SKPaymentTransactionStateFailed:
            [self failedTransaction:transaction];
            break;
        case SKPaymentTransactionStateRestored:
        default:
            break;
        }
        */
    }
}

Теперь вы запустите приложение и войдите в систему с удаленной записью песочницы. Вышеуказанный метод должен немедленно сработать и закончить транзакцию. Если массив транзакций равен нулю, попробуйте вызывать код завершения перед циклом FOR.

Ответ 3

Я получил это, чтобы снова работать, вызвав следующий код, который будет выполнен один раз. Вам может быть предложено ввести пароль в последний раз, но после того, как код был выполнен, "экзорцизм" будет выполнен, и вы сможете снова удалить код.

#ifdef DEBUG
    for (SKPaymentTransaction *transaction in [[SKPaymentQueue defaultQueue] transactions]) {
        NSLog(@"finish transactions pending sind last load...");
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    }
#endif