Я знаю, что это старая тема, но у меня возникли проблемы с поиском решения, и я несколько раз пытался найти причудливый метод проб и ошибок, пока не нашел решение, поэтому подумал, что поделюсь им здесь, так как нигде не смог его найти еще.
Сначала убедитесь, что после каждой транзакции вы звоните:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
В моем случае произошло то, что транзакция не была завершена и осталась в очереди, поэтому даже когда я переключился на другую учетную запись в песочнице, он все еще продолжал запрашивать пароль моей старой учетной записи.
Чтобы исправить это я добавил:
SKPaymentQueue *queue = [SKPaymentQueue defaultQueue];
for (SKPaymentTransaction *transaction in queue.transactions) {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
ДО того, как я добавил наблюдателя транзакции, т.е. это:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
Также в
(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
функция, я добавил эту строку кода:
[queue finishTransaction:transaction];
в случаях SKPaymentTransactionStateRestored и SKPaymentTransactionStateFailed оператора switch. Не добавляйте его в купленное состояние, потому что вам не разрешено называть финиш на этом из того, что я знаю.
Я не уверен, какой из двух вышеперечисленных шагов исправил ошибку, потому что она сохранялась до тех пор, пока я не вышел из моего iPhone, не удалил приложение, не выключил его и не произвел чистую перестройку / установку, которая наконец перестала спрашивать меня пароль для аккаунта с ошибками. Надеюсь, это кому-нибудь поможет.
РЕДАКТИРОВАТЬ: (11/12/15)
Итак, я выяснил причину взлома учетных записей в песочнице. Это произошло после восстановления покупок, затем нажатия клавиши home, повторного открытия и повторного нажатия кнопки восстановления, что вызвало сбой. Восстановление осталось в очереди, и описанный выше процесс был единственным способом выйти из всплывающих окон с запросом пароля.
Чтобы остановить это, я добавил:
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
до функции tearDown (вызываемой applicationDidEnterBackground :) моего контроллера основного вида перед тем, как я установил в диспетчере покупок объект из приложения. Я думаю, что произошло то, что я добавил объект в качестве наблюдателя транзакции более одного раза, и это вызывало странное поведение. Судя по всему, это, похоже, полностью устранило проблему, потому что я больше не мог воссоздать ошибку.