Когда использовать restoreCompletedTransactions для покупок в приложении? - PullRequest
45 голосов
/ 18 ноября 2009

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

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

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

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

Примечания

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

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

Ответы [ 3 ]

32 голосов
/ 18 ноября 2009

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

16 голосов
/ 22 июня 2011

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

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

Все это подчеркивает проблему с IAP Apple - он плохо продуман и недостаточно документирован - и теперь ТРЕБУЕТСЯ для поставщиков контента, таких как устройства для чтения электронных книг, у которых уже есть отлично функционирующие интернет-магазины, уже работающие в их приложениях (например, Kindle).

4 голосов
/ 27 декабря 2012

Всякий раз, когда у вас есть непотребляемая покупка в приложении, например, новая гоночная трасса, вам нужно внедрить кнопку «Восстановить» где-нибудь в приложении, чтобы пользователь мог восстановить свою покупку, если они меняют устройства или удаляют приложение. Это является обязательным условием, и ранее Apple отказывала в приложении, поскольку кнопка «Восстановить» не была реализована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...