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

Когда использовать restoreCompletedTransactions для покупок в приложении?

Для базового приложения с покупками в нестандартных приложениях кто-нибудь выяснил, как использовать SKPaymentQueue restoreCompletedTransactions?

Наблюдения

Я знаю, что рекомендуется всегда регистрировать наблюдателя транзакции для получения отложенных транзакций, которые возвращаются в приложение, но это другой вопрос. Похоже, что restoreCompletedTransactions - это то, что приложение должно активно решать, когда вызывать опрос для всех покупок, которые клиент уже сделал.

Из того, что я могу сказать, метод предназначен для получения покупок, которые могут быть потеряны. Например, клиент может установить или переместить приложение на новое устройство таким образом, чтобы локальные записи приложений предыдущих платежей были потеряны или reset.

Обеспокоенность

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

В то же время я не хочу вызывать restoreCompletedTransactions каждый раз, когда приложение запускается, чтобы быть в безопасности, и в основном возвращать транзакции, которые я уже знаю о 99,9% времени. (За исключением покупки в приложении, мое приложение действительно не требует подключения к сети.)

Примечания

Документация Apple разъясняет, что клиенты не взимают плату за любые неиспользованные покупки, которые они уже совершили. Если они попытаются повторно купить, транзакция по-прежнему будет отправлена ​​в приложение.

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

4b9b3361

Ответ 1

Обновление (июнь 2019 г.)

Документация Apple по этой теме была обновлена в 2018 году и является достаточно полной. Многие из его рекомендаций соответствуют тому, что мы выяснили здесь. Самым большим событием с тех пор, как этот вопрос был впервые опубликован в 2009 году, является квитанция App Store в iOS 7.

В случае, если ссылка в будущем станет устаревшей, я приведу здесь некоторую документацию.

Восстановление купленных товаров

Пользователи восстанавливают транзакции для обеспечения доступа к уже приобретенному контенту. Например, при обновлении до нового телефона они не теряют все предметы, приобретенные на старом телефоне. Включите в свое приложение какой-нибудь механизм, позволяющий пользователю восстанавливать свои покупки, например кнопку "Восстановить покупки". Восстановление покупок запрашивает учетные данные пользователей App Store, что прерывает поток вашего приложения: из-за этого не происходит автоматического восстановления покупок, особенно не каждый раз, когда ваше приложение запускается.

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

  • Если вы используете размещенный в Apple контент, восстановление завершенных транзакций дает вашему приложению объекты транзакций, которые он использует для загрузки контента.
  • Если вам нужно поддерживать версии iOS, предшествующие iOS 7, где квитанция приложения недоступна, вместо этого восстановите завершенные транзакции.
  • Если ваше приложение использует невозобновляемые подписки, ваше приложение отвечает за процесс восстановления.

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

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


Предыдущий ответ (2009-2012)

Выписав вопрос и подумав, я нашел пару решений.

Автоматический (не рекомендуется)

Одним из вариантов является запись в пользовательских значениях по умолчанию того, был ли restoreCompletedTransactions вызван (и успешно завершен) еще в приложении. Если нет, приложение вызывает его один раз при запуске. Поскольку этот флаг может храниться в том же месте, что и непотребляемые платежи, если пользовательские значения по умолчанию будут удалены позже, метод восстановления будет вызван снова при запуске приложения.

Таким образом, если существующий клиент каким-то образом выполняет новую установку приложения, он все равно восстанавливает свои покупки автоматически. Если это новый клиент, который никогда не запускал приложение раньше, то операция восстановления ничего не возвращает.

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

Руководство (рекомендуется)

Другой вариант - предложить клиенту кнопку "Восстановить покупки" где-нибудь, подключить ее к restoreCompletedTransactions и позволить ему решить, когда и когда она может понадобиться.

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

Ответ 2

Не забывайте, что один идентификатор Apple может охватывать несколько устройств. Таким образом, поддержание флага на одном устройстве (скажем, пользовательском iPhone), который сообщает вам, выполнило ли вы восстановление, не позволит вам определить, совершил ли покупатель покупку на другом устройстве (скажем, его iPad), который нуждается в для восстановления на iPhone. Поэтому, если у вас есть автоматический метод запуска восстановления, это также необходимо, даже если у вас есть автоматический метод.

Что еще хуже, я еще не понял, как вы узнали, когда сделаны REFUNDS из IAP. Я подозреваю, что процесс восстановления просто вернет список невозмещенных транзакций. Итак, a) вам нужно УДАЛИТЬ вашу запись IAP пользователя, когда вы выполняете восстановление, в случае, если возвращенные продукты просто не сообщаются во время восстановления, и b) вам необходимо периодически делать восстановление автоматически, чтобы получить возмещение.

Все это подчеркивает проблему с Apple IAP - она ​​плохо задумана и неадекватно документирована, и теперь она НЕОБХОДИМА для поставщиков контента, таких как читатели электронных книг, у которых уже есть прекрасно функционирующие веб-магазины, уже работающие в своих приложениях (например, Kindle).

Ответ 3

Всякий раз, когда у вас есть нерасходуемая покупка в приложении, например, для новой дорожки Race Track, вам нужно внедрить кнопку "Восстановить" где-нибудь в приложении, чтобы пользователь мог восстановить свою покупку, если они меняют устройства или удаляют приложение. Это обязательное условие, и Apple отклонила приложение раньше, чем не реализовала кнопку Restore.