Подтвердить что ты не робот

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?
4b9b3361

Ответ 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: