Не удалось завершить незавершенные транзакции в очереди платежей
Мое приложение перешло в нечетное состояние в песочнице 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