SKPaymentQueue addTransactionObserver запрашивает пароль App Store при запуске после покупки в приложении - PullRequest
56 голосов
/ 14 февраля 2011

Мое приложение использует встроенные покупки, и большинство моих пользователей могут совершать покупки без проблем.Для этих людей мое приложение загружает контент после успешной покупки, и они счастливы.

Однако, для растущего числа моих пользователей, после того, как они завершили успешную покупку в приложении, у них запрашивают свое приложение.Храните пароль каждый раз, когда приложение запускается после этого.Я полагаю, что это происходит при вызове:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

, который я вызываю при запуске в соответствии с шагом 6 в руководстве по покупке Apple в приложении:

Я предполагаю, что по какой-то причине серверы покупок в приложении Apple не регистрируют, что транзакция завершилась успешно - дажехотя я звоню

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

, когда транзакция завершена и мой контент успешно загружен.

2 вопроса:

  1. Кто-нибудь еще видитэто?

  2. У кого-нибудь есть предлагаемое исправление?

BOUNTY EDIT :

Этотранзакция, которая была сделана с другим Apple-ID.Вот почему это не может быть завершено, если вы не введете правильные учетные данные в диалоговом окне.Вопрос должен быть либо:

  1. Как я могу предотвратить такие мертвые транзакции (транзакция не была завершена, у пользователя нет сети, тем временем изменяется App-ID)?
  2. Как вы можетеподрезать SkPaymentQueue?

Ответы [ 14 ]

31 голосов
/ 01 июня 2012

У меня была такая же проблема. Убедитесь, что вы звоните

[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

для всех трех состояний транзакций: SKPaymentTransactionStatePurchased, SKPaymentTransactionStateRestored, SKPaymentTransactionStateFailed.

6 голосов
/ 23 августа 2015

У меня была такая же проблема, что при входящем звонке появлялось приглашение:

[[SKPaymentQueue defaultQueue] addTransactionObserver:observer];

Оно также появлялось время от времени, даже когда я не использовал свое приложение (на домашнем экране или в других приложениях), что действительно раздражало. Оглядываясь вокруг, кажется, что было предложено так много ответов на этот вопрос, но я, наконец, нашел решение из комбинации того, что я собрал.

Примечание. До шага 1 я удалил тестовую учетную запись «песочницы» в iTunes Connect. Я не уверен, повлияет ли это на решение.

Чтобы решить проблему, я сделал следующее:

  1. Запустите ваше приложение из Xcode.
  2. Подождите, пока не появится приглашение. Введите пароль для нужной учетной записи и нажмите ОК.
  3. Нажмите кнопку «Домой» на устройстве.
  4. Убить приложение из Xcode.
  5. Удалить приложение с устройства.
  6. Выйдите из iTunes & App Store в приложении «Настройки».
  7. Выключите устройство и включите его снова.
  8. Купите что-нибудь в App Store. Когда появится запрос, войдите в систему с учетной записью Apple ID. (Я предполагаю, что вы сможете просто войти в систему с рабочей учетной записью в iTunes & App Store в приложении «Настройки», но я так и сделал).
  9. Вернитесь в Xcode и снова запустите ваше приложение. (Это должна быть новая установка, поскольку вы ранее удалили приложение.)
  10. Подождите, пока появится приглашение для входа.
  11. Нажмите Отмена. Откроется диалоговое окно с надписью «Требуется вход. Нажмите« Продолжить »и войдите в систему, чтобы проверить наличие загрузок. [Environment: Sandbox]». Это было ключевое отличие от ранее. У меня никогда не было этого диалогового окна, когда я нажимал Отмена, когда он спрашивал у меня пароль.
  12. Нажмите Продолжить.
  13. Введите пароль для учетной записи.

Вот и все. С тех пор приглашение на вход в систему перестало появляться при каждом запуске приложения, а также перестало появляться в случайное время.

Надеюсь, это поможет!

3 голосов
/ 12 июня 2016

НЕ УДАЛЯЙТЕ ОТВЕТ ЗДЕСЬ. Именно этот конкретный вопрос о Stackoverflow ввел меня в заблуждение и напутал в течение нескольких дней.

Я помещаю это здесь, потому что есть много действительно плохих ответов, которые предоставляют НЕПРАВИЛЬНУЮ информацию о том, как решить проблему.

НЕ:

  • Удалить тестового пользователя из песочницы. Это делает невозможным решение проблемы, и вам придется обратиться в службу поддержки Apple, чтобы решить ее вручную.
  • Если вы удалите тестового пользователя из песочницы, когда вам впоследствии будет неоднократно предложено войти в систему как этот пользователь и завершить транзакцию, вы не сможете, поэтому возникает проблема Endless Loop . Вы также не сможете снова добавить удаленного тестового пользователя; портал разработчиков сообщает, что идентификатор пользователя уже использовался.
  • Удалите приложение или переустановите iOS или любую другую подобную чушь. Это не имеет никакого эффекта, не решает проблему и тратит много времени.

DO:

  • Call Finish для ВСЕХ транзакций.
  • Если по какой-либо причине кто-то прерывается, просто завершите его при следующем запуске приложения. Приложению будет неоднократно отправляться уведомление об очереди платежей до тех пор, пока вы не вызовете финиш на нем:

[[SKPaymentQueue defaultQueue] finishTransaction: транзакция];

Вот и все, завершите все транзакции! В противном случае вы будете отправляться в ад бесконечной петли запросов на вход каждый раз, когда ваше приложение запускается на этом устройстве.

3 голосов
/ 01 апреля 2014

Существует проблема, которая называется «бесконечный цикл». Это было большой проблемой в первые дни автоматического продления, когда в течение недели серверы не ограничивали продления до 5. Устройство, которое получает транзакцию и не вызывает finishTransaction, получит эту транзакцию на устройство примерно один раз неделю, пока этот конкретный тестовый пользователь не войдет в систему и не завершит транзакцию. Если вы переключитесь в режим полета, вы сможете «очистить» эти транзакции еще на неделю, но они возвращаются.

3 голосов
/ 10 апреля 2012

Я подозреваю, что это правильное поведение.Когда вы устанавливаете делегата SKPaymentQueue, попробуйте проверить, есть ли какие-либо транзакции для завершения.Не может быть не завершенных транзакций, но сам факт проверки требует авторизации в iTunes.И я думаю, что вы ничего не можете с этим поделать.

Обычно это имеет некоторый смысл, но это довольно раздражает пользователей, которые настроили запрашивать пароль для каждой транзакции (например, для защиты детей).Таким образом, единственный способ бороться с этим - явно установить делегат, когда вы собираетесь запросить iTunes.Например, вы можете добавить кнопку типа «Восстановить мои покупки».Не очень красиво, но определенно менее раздражает.

1 голос
/ 14 апреля 2016

Если кто-то видит это и использует GoogleMobileAds.framework, вам также может понадобиться позвонить

[GADMobileAds disableAutomatedInAppPurchaseReporting];

в -application:didFinishLaunchingWithOptions:

1 голос
/ 12 мая 2014

Я решил ее путем удаления учетной записи тестового пользователя iTunes Connect , связанной с этой проблемой. Приложение фактически снова попросило войти в систему, но затем оно исчезло (я также удалил приложение, перезапустил iPhone и вошел в систему как обычный пользователь без песочницы, произвел реальное восстановление в другом приложении без песочницы и затем запустил приложение)

1 голос
/ 27 марта 2014

У меня та же проблема при тестировании IAP.
Я проверил с 3 тестовой учетной записи, приложение держать запрос пароля для обеих учетных записей. даже если я не нажал ни одной кнопки покупки / восстановления или addTransactionObserver.
Я думаю, это потому, что некоторые предыдущие транзакции не были завершены правильно,
но [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; ничем не может помочь.
вот что я делаю, чтобы решить эту проблему:

  1. введите пароль для каждой учетной записи независимо от того, сколько раз приложение магазин спрашиваю - я вводил 6 раз для 3 аккаунта - пока он никогда не спрашивал еще раз.
  2. перейти к настройке и выйти из идентификатора яблока.
  3. нормально выходите из приложения - не завершайте его в xcode. затем убейте процесс в списке задач.
  4. удалить приложение с устройства (просто удалить приложение не получится, оно все равно попросит пароль)
  5. перезагрузить устройство
  6. Запустите приложение снова из XCode / в вашем случае переустановите приложение из магазина приложений.

вдохновлено Ожидаемая последовательность при использовании тестового пользователя iTunes

0 голосов
/ 07 августа 2015

Вот как я могу последовательно воспроизвести и решить эту проблему:

iOS 8.4, разработка сборки приложения.

1) Использовать тестовую (песочницу) учетную запись Apple.

2) Восстановить купленные транзакции.

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]

3) Немедленно закройте приложение.

4) Выйти из тестовой учетной записи (через настройки)

5) Запустить приложение

Теперь каждый раз, когда я запускаю приложение, оно выскакивает в форму «логин». Неважно, введу ли я пароль или нет. Не имеет значения, делаю ли я покупки или восстанавливаю покупки. Не имеет значения, удаляю ли я и переустанавливаю ли приложение. Каждый раз, когда я запускаю приложение, отображается логин iTune.

Исправлено: аппаратная перезагрузка устройства.

Вот что я не знаю. Произойдет ли это в производственной среде (опубликованное приложение и фактический логин Apple)? Я надеюсь, что нет.

0 голосов
/ 20 января 2014

Вы знаете, я решил эту проблему, внеся изменения в мои обновленные транзакции. Я не добавил [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; для всех ситуаций.

...