SKPaymentQueue addTransactionObserver запрашивает пароль магазина приложений при запуске после покупки в приложении
мое приложение использует в приложение покупки, и большинство моих пользователи могут приобрести без каких-либо проблем. Для этих людей мое приложение загружает контент после успешной покупки, и они счастливы.
тем не менее, для растущего числа моих пользователей, как только они завершают успешную покупку в приложении, они запрашивают пароль для своего магазина приложений каждый раз, когда приложение запускается после этого. Я считаю, что это происходит по вызову:
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
что я призываю запуск в соответствии с шагом 6 в руководстве Apple по покупке в приложении:
- архивное руководство: https://web.archive.org/web/20130515222703/https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/AddingaStoretoYourApplication/AddingaStoretoYourApplication.html
- фактическое руководство: https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW4
Я предполагаю, что по какой-то причине серверы Apple in - app purchase не регистрируют, что транзакция завершилась успешно, хотя я звоню
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
когда операция завершена, и мой контент был успешно загружен.
2 вопросы:
кто-нибудь еще видит это?
есть ли у кого-нибудь предлагаемое исправление?
BOUNTY EDIT:
это транзакция, которая была сделана с другим Apple-ID. Вот почему он не может быть завершен, если вы не введете правильные учетные данные в диалоговом окне. Вопрос должен быть:
- как я могу предотвратить такие сделки (сделки не было закончено, пользователь не имеет Сети, а тем временем меняет App-ID)?
- как вы можете обрезать
SkPaymentQueue
?
14 ответов:
У меня была та же проблема.убедитесь, что вы звоните
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
для всех трех состояний транзакций: SKPaymentTransactionStatePurchased, SKPaymentTransactionStateRestored, SKPaymentTransactionStateFailed.
У меня была такая же проблема пригашение на вызов:
[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];
Он также появлялся время от времени, даже когда я не использовал свое приложение (на главном экране или в других приложениях), что было очень раздражающим. Оглядываясь вокруг, кажется, что есть так много предложенных ответов на этот вопрос, но я, наконец, нашел решение из комбинации того, что я собрал.
Примечание: перед шагом 1 я удалил тестовую учетную запись sandbox в iTunes Connect. Я не конечно, если это повлияет на решение.
решить проблему это то, что я сделал:
- запустите приложение из Xcode.
- дождитесь появления запроса. Введите пароль для нужной учетной записи и нажмите OK.
- Нажмите кнопку Home на устройстве.
- убить приложение из Xcode.
- удалить приложение с устройства.
- выйдите из iTunes & App Store в приложении Настройки.
- включить выключите устройство и снова включите его.
- купить что-то из магазина приложений. Когда он предложит вам, войдите в систему с производственной учетной записью Apple ID. (Я предполагаю, что вы должны быть в состоянии просто войти с производственной учетной записью в iTunes & App Store в приложении Настройки, но это, как я это сделал).
- вернитесь к Xcode и снова запустите приложение. (Это должна быть новая установка, так как вы удалили приложение раньше.)
- Дождитесь приглашения на вход вверх.
- Нажмите "Отмена". Диалоговое окно с надписью " Вход требуется. Нажмите Продолжить и войдите, чтобы проверить наличие загрузок. [Окружающая среда: песочница] " должен прийти. Это было ключевое отличие от предыдущих. У меня никогда не было этого диалога, когда я нажал кнопку "Отмена", когда он просил меня ввести пароль.
- Нажмите Кнопку "Продолжить".
- введите пароль для учетной записи.
вот и все. С тех пор приглашение на вход перестало появляться всякий раз, когда я запускал свое приложение, а также перестал появляться в случайные моменты времени.
надеюсь, что это помогает!
Я подозреваю, что это правильное поведение. При установке делегата SKPaymentQueue попробуйте проверить, если есть некоторые транзакции для завершения. Возможно, нет незавершенных транзакций, но факт проверки требует входа в iTunes. И я думаю, что вы ничего не можете с этим поделать.
обычно это имеет некоторый смысл, но это довольно раздражает пользователей, которые настроили запрос пароля для каждой транзакции (например, некоторые средства защиты детей). Так что единственный способ бороться с этим он должен установить делегат явно, когда вы собираетесь запросить iTunes. Например, вы можете добавить кнопку "Восстановить покупки". Не очень красиво, но определенно менее раздражает.
существует проблема, называемая "бесконечный цикл". Это была большая проблема еще в первые дни auto renewables, когда около недели серверы не ограничивали продление до 5. Устройство, которое получает транзакцию и не вызывает finishTransaction, будет получать эту транзакцию на устройство примерно раз в неделю, пока этот конкретный тестовый пользователь не войдет в систему и не вызовет finishTransaction. Если вы переключитесь в режим полета, вы можете "очистить" эти транзакции еще на неделю - но они приходят спина.
НЕ УДАЛЯЙТЕ ОТВЕТ ЗДЕСЬ. именно этот вопрос Stackoverflow ввел меня в заблуждение и испортил меня в течение нескольких дней.
Я запишу это здесь, потому что есть много действительно плохих ответов, которые предоставляют неверную информацию о том, как решить проблему.
НЕ НАДО:
- удалить тестового пользователя песочницы. Это делает невозможным решить проблему, и вам придется обратиться в службу поддержки разработчиков Apple, чтобы разрешить вручную.
- если вы удаляете тестового пользователя песочницы, когда вам впоследствии неоднократно предлагается войти в систему как этот пользователь и завершить транзакцию, вы не можете, следовательно, имя Бесконечный Цикл
У меня такая же проблема при тестировании IAP.
Я тестировал с 3 тестовой учетной записью, приложение продолжает запрашивать пароль для обеих учетных записей. даже если я не касался кнопки покупки/восстановления или addTransactionObserver.
Я думаю, это потому, что некоторые предыдущие транзакции не закончились правильно,
но[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
ничем не могу помочь.
так вот что я делаю, чтобы решить эту проблему:
- ввод пароля для каждой учетной записи независимо от того, сколько раз приложение магазин спросите Для--я ввожу 6 раз для 3 счета--пока он никогда не спросит снова.
- перейдите к настройке и выйдите из Apple ID.
- выход из приложения обычно--не завершайте его в xcode. затем убейте процесс в списке задач.
- удалить приложение с устройства (просто удалите приложение не будет работать он все равно попросит пароль)
- перезагрузка устройства
- запустите приложение снова из XCode / в вашем случае переустановите приложение из app store.
вдохновленный ожидаемая последовательность при использовании iTunes test user
Я решил это с помощью удаление учетной записи тестового пользователя iTunes Connect связано с этой проблемой. Приложение фактически попросило еще раз войти в систему, но затем оно исчезло (я также удалил приложение, перезапустил iPhone и вошел в систему как обычный пользователь без песочницы, сделал реальное восстановление в другом приложении без песочницы, а затем запустил приложение)
Если кто-то видит это и использует GoogleMobileAds.рамки тогда вам также может понадобиться позвонить
[GADMobileAds disableAutomatedInAppPurchaseReporting];
на
-application:didFinishLaunchingWithOptions:
удаление и повторная установка приложения удалит все старые транзакции, связанные с другой учетной записью itunes. Если вы все еще видите транзакции, отправленные в очередь уведомлений, то у вас, вероятно, была какая-то ветвь в вашей логике, которая не вызывала finishTransaction.
вам нужно вызвать finishTransaction на все транзакции, которые разносятся в paymentQueue:updatedTransactions:, даже с SKPaymentTransactionStateFailed.
ошибки, связанные с покупками в приложении, исправлены в обновлении iOS 5.1.1 http://support.apple.com/kb/DL1521
проверьте следующее, Как это было в моем методе viewDidLoad. У меня было приложение отклонено, когда apple хотела, чтобы я перешел от непотребляемого к потребляемому, однако я оставил следующую строку в своем методе viewDidLoad: (я думал, что запрос пароля был проблемой с заменой от тестового пользователя к обычному пользователю обратно к тестовому пользователю)
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
после удаления запрос пароля остановлен.
и я ушел:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
В и приложение теперь было одобрено только штраф.
вы знаете, я решил эту проблему, сделав изменение в моих updatedTransactions. Я не добавлял
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
для всех ситуаций.
вот как я могу последовательно воспроизвести и решить эту проблему:
iOS 8.4, разработка сборки приложения.
1) Используйте тестовую (песочницу) учетную запись Apple.
2) Восстановление приобретенных сделок.
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
3) немедленно закройте приложение.
4) выйти из тестовой учетной записи (через настройки)
5) запустить приложение
теперь каждый раз, когда я запускаю приложение, оно будет всплывать форма "вход". Это не имеет значения, если я введите пароль или нет. Это не имеет значения, если я делаю покупки или восстановить покупки. Это не имеет значения, если я удалить и переустановить приложение. Каждый раз, когда я запускаю приложение, отображается логин iTune.
исправление: Жесткая перезагрузка устройства.
вот чего я не знаю. Будет ли это происходить в производственной среде (опубликованное приложение и фактический вход apple)? Надеюсь, что нет.