Я знаю, что это старая тема, но у меня были проблемы с поиском решения, и я прошел через несколько утомительных проб и ошибок, пока не нашел решение, поэтому я подумал, что поделюсь им здесь, так как я не смог найти его где-либо еще.
Во-первых, убедитесь, что после каждой транзакции, которую вы вызываете:
[[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)
Итак, я выяснил причину взлома учетных записей песочницы. Это произошло после восстановления покупок, нажатия клавиши «Домой», повторного открытия и повторного нажатия кнопки восстановления, что привело к сбою. Восстановление оставалось в очереди, и описанный выше процесс был единственным способом выйти из всплывающих окон с запросом пароля.
Чтобы это остановить, я добавил:
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
с помощью функции tearDown (вызываемой applicationDidEnterBackground :) моего контроллера основного представления, прежде чем я обнулял свой объект диспетчера покупок в приложении. Я думаю, что произошло то, что я несколько раз добавлял объект в качестве наблюдателя транзакции, и это вызывало странное поведение. Судя по всему, это, похоже, полностью устранило проблему, потому что я не смог снова воссоздать ошибку.
person
DukeH
schedule
11.11.2014