SKPaymentQueue addTransactionObserver запрашивает пароль для App Store при запуске после покупки в приложении
Мое приложение использует покупки в приложениях, и большинство моих пользователей могут купить как можно лучше, без каких-либо проблем. Для этих людей мое приложение загружает контент после успешной покупки, и они счастливы.
Тем не менее, для растущего числа моих пользователей, когда они завершают успешную покупку в приложении, их спрашивают о своем пароле в App Store каждый раз, когда приложение запускается после этого. Я считаю, что это происходит при вызове:
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
который я вызываю при запуске в соответствии с шагом 6 в руководстве по покупке Apple в приложении:
Я предполагаю, что по какой-то причине серверы покупок Apple в приложении не регистрируют успешную транзакцию, даже если я звоню
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
когда транзакция завершена, и мой контент был успешно загружен.
2 вопроса:
BOUNTY EDIT:
Это транзакция, которая была сделана с использованием другого Apple-ID. Вот почему он не может быть закончен, если вы не введете правильные учетные данные в диалоговом окне. Вопрос должен быть:
- Как я могу предотвратить такие мертвые транзакции (транзакция еще не завершена, у пользователя нет сети, а пока что меняется App-ID)?
- Как вы можете обрезать
SkPaymentQueue
?
Ответы
Ответ 1
У меня была такая же проблема. Убедитесь, что вы вызываете
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
для всех трех состояний транзакций: SKPaymentTransactionStatePurchased, SKPaymentTransactionStateRestored, SKPaymentTransactionStateFailed.
Ответ 2
У меня была та же проблема, что и приглашение для входа в систему при вызове:
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
Он также появлялся время от времени, даже когда я не пользовался моим приложением (на главном экране или в других приложениях), что было действительно раздражает. Оглядываясь по сторонам, кажется, что так много предложенных ответов на этот вопрос, но я, наконец, нашел решение из комбинации того, что я собрал.
Примечание. До шага 1 я удалил тестовую песочницу в iTunes Connect. Я не уверен, повлияет ли это на решение.
Чтобы решить проблему, это то, что я сделал:
- Запустите приложение из Xcode.
- Подождите, пока появится запрос. Введите пароль для требуемой учетной записи и коснитесь OK.
- Нажмите кнопку "Домой" на устройстве.
- Убейте приложение из Xcode.
- Удалите приложение с устройства.
- Выйдите из iTunes и App Store в приложении "Настройки".
- Выключите устройство и снова включите его.
- Купите что-нибудь из App Store. Когда он предложит вам выполнить вход в систему с помощью учетной записи Apple ID. (Я предполагаю, что вы должны иметь возможность просто войти в систему с производственной учетной записью в iTunes и App Store в приложении "Настройки", но так я это сделал).
- Вернитесь в Xcode и запустите приложение снова. (Это должно быть новая установка, поскольку вы удалили приложение раньше.)
- Подождите, пока появится запрос на вход.
- Нажмите "Отмена". В диалоговом окне "Войти в систему" нажмите "Продолжить" и войдите в систему, чтобы проверить наличие загрузок. [Environment: Sandbox] "должно появиться. Это было ключевым отличием от предыдущих. У меня никогда не было этого диалога, когда я нажал "Отмена", когда он просил меня ввести пароль.
- Нажмите "Продолжить".
- Введите пароль для учетной записи.
Что это. С этого момента приглашение на вход в систему перестало появляться, когда я запускал приложение, а также прекращал ходить в случайные моменты.
Надеюсь, это поможет!
Ответ 3
Я подозреваю, что это правильное поведение. Когда вы устанавливаете делегат SKPaymentQueue, попробуйте проверить, есть ли какие-то транзакции для завершения. Не может быть никаких завершенных транзакций, но факт проверки требует входа в iTunes. И я думаю, вы ничего не можете с этим поделать.
Как правило, это имеет какой-то смысл, но это довольно раздражает для пользователей, которые настроили запрос пароля для каждой транзакции (например, для защиты некоторых детей). Таким образом, единственный способ борьбы с ним - установить делегат явно, когда вы собираетесь запросить iTunes. Например, вы можете добавить некоторую кнопку, например "Восстановить мои покупки". Не очень красиво, но определенно менее раздражает.
Ответ 4
Возникает проблема, называемая "бесконечным циклом". Это была большая проблема еще в первые дни использования возобновляемых источников энергии, когда около недели серверы не ограничивали продление до 5. Устройство, которое получает транзакцию и не вызывает finishTransaction, получит эту транзакцию, поставленную на устройство примерно раз в течение недели, пока этот конкретный пользователь теста не войдет в систему и не вызовет функцию finishTransaction. Если вы перейдете в режим самолета, вы можете "очистить" эти транзакции еще на одну неделю, но они вернутся.
Ответ 5
НЕ УДАЛЯЙТЕ ОТВЕТ НА ЗДЕСЬ. Именно этот вопрос в Stackoverflow ввел меня в заблуждение и надолго испортил меня.
Я помещаю это здесь, потому что есть много очень плохих ответов, которые предоставляют НЕПРАВИЛЬНУЮ информацию о том, как решить проблему.
НЕ НЕ:
- Удалить пользователя тестовой программы. Это не позволяет решить проблему, и вам придется связаться с администратором Apple, чтобы разрешить ее вручную.
- Если вы удалите пользователя тестовой программы sandbox, когда впоследствии вам будет предложено войти в систему как этот пользователь и завершить транзакцию, вы не сможете, следовательно, это имя Бесконечная петля. Кроме того, вы не сможете снова добавить удаленного пользователя теста; портал разработчика говорит, что идентификатор пользователя уже используется.
- Удалите приложение или переустановите iOS или любую другую такую глупость. Это не влияет, не решает проблему и тратит много времени.
DO:
- Вызов Finish для транзакций ALL.
- Если кто-то прерван по какой-либо причине, просто заполните его при следующем запуске приложения. Приложение будет повторно отправлено уведомление о очереди платежа, пока вы не назовете его завершением:
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
Это, закончить все транзакции! Кроме того, вы будете отправлены в ад бесконечной петли знака в запросах каждый раз, когда ваше приложение запускается на этом устройстве.
Ответ 6
У меня такая же проблема при тестировании IAP.
Я протестировал с 3 тестовыми аккаунтами, приложение будет запрашивать пароль для обеих учетных записей. даже если я не касался кнопки покупки/восстановления или addTransactionObserver.
Я думаю, это связано с тем, что некоторая предыдущая транзакция закончилась неправильно,
но [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
не может вообще помочь.
так вот что я делаю для решения этой проблемы:
- введите пароль для каждой учетной записи независимо от того, сколько раз приложение
магазин прошу - я ввожу 6 раз за 3 счета - пока он никогда не спросит
еще раз.
- перейти к настройке и вывести идентификатор Apple.
- выйти из приложения обычно - не завершать его в xcode. затем запустите процесс в списке задач.
- удалить приложение с устройства (просто удалить приложение не будет работать, он все равно попросит пароль)
- перезагрузите устройство.
- Запустите приложение снова из XCode/в вашем случае переустановите приложение из магазина приложений.
вдохновленный Ожидаемая последовательность при использовании пользователя тестирования iTunes
Ответ 7
Я разрешил это с помощью удаления тестовой пользовательской учетной записи iTunes Connect, связанной с этой проблемой. Приложение действительно попросило еще раз войти в систему, но потом он исчез (я также удалил приложение, перезапустил iPhone и вошел в систему как обычный пользователь без песочницы, сделал реальное восстановление в другом приложении без песочницы, а затем запустил приложение)
Ответ 8
Кажется, неразрешимая проблема:) Я отправлю запрос при поддержке Apple...
Ответ 9
Удаление и повторная установка приложения удалит все старые транзакции, связанные с другой учетной записью itunes. Если вы все еще видите транзакции, отправленные в очередь уведомлений, то у вас, вероятно, была какая-то ветвь в вашей логике, которая не вызывала endTransaction.
Вам нужно вызвать finishTransaction для всех транзакций, которые отправляются на paymentQueue: updatedTransactions: даже те, у которых SKPaymentTransactionStateFailed.
Ответ 10
ошибки, связанные с покупками приложений, исправленные в обновлении iOS 5.1.1
http://support.apple.com/kb/DL1521
Ответ 11
Проверьте следующее, как это было в моем методе viewDidLoad. У меня было отклонено приложение, когда яблоко хотело, чтобы я перешел от нерасходуемого к расходному материалу, однако я оставил следующую строку в методе viewDidLoad: (я думал, что запрос пароля был проблемой при замене от пользователя-тестировщика на обычного пользователя обратно на тестовый пользователь)
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
После удаления запроса на остановке пароля.
И я ушел: [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
и приложение теперь одобрено просто отлично.
Ответ 12
Вы знаете, я решил эту проблему, внеся изменения в мои обновленные транзакции. Я не добавлял [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
для всех ситуаций.
Ответ 13
Вот как я могу последовательно воспроизводить и решать эту проблему:
iOS 8.4, разработка сборки приложения.
1) Используйте тестовую (песочницу) учетную запись Apple.
2) Восстановить купленные транзакции.
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
3) Немедленно закройте приложение.
4) Выход из тестовой учетной записи (через настройки)
5) Запустить приложение
Теперь каждый раз, когда я запускаю приложение, он выдает форму "login". Неважно, вводя пароль или нет. Неважно, делаю ли я покупки или восстанавливаю покупки. Не имеет значения, удалю ли я и переустановил приложение. Каждый раз, когда я запускаю приложение, отображается вход в iTune.
Исправлено: Жесткая перезагрузка устройства.
Вот чего я не знаю. Это произойдет в производственной среде (опубликованное приложение и фактический вход в систему Apple)? Надеюсь, что нет.
Ответ 14
Если кто-либо видит это и использует GoogleMobileAds.framework, вам также может потребоваться позвонить
[GADMobileAds disableAutomatedInAppPurchaseReporting];
in -application:didFinishLaunchingWithOptions: