Обновление (июнь 2019 г.)
Документация Apple по этой теме была обновлена в 2018 году и является достаточно полной. Многие из его рекомендаций соответствуют тому, что мы выяснили здесь. Самым большим событием с тех пор, как этот вопрос был впервые опубликован в 2009 году, является квитанция App Store в iOS 7.
В случае, если в какой-то момент в будущем ссылка устареет, я приведу здесь некоторую документацию.
Восстановление приобретенных продуктов
Пользователи восстанавливают транзакции для обеспечения доступа к уже приобретенному контенту. Например, когда они переходят на новый телефон, они не теряют все предметы, приобретенные на старом телефоне. Включите в свое приложение какой-нибудь механизм, позволяющий пользователю восстанавливать свои покупки, например кнопку «Восстановить покупки». Восстановление покупок запрашивает учетные данные пользователя App Store, что прерывает поток вашего приложения: из-за этого не происходит автоматического восстановления покупок, особенно не каждый раз, когда ваше приложение запускается.
В большинстве случаев все, что нужно вашему приложению, это обновить квитанцию и доставить продукты в квитанции. Обновленная квитанция содержит запись покупок пользователя в этом приложении, на этом устройстве или любом другом устройстве. Однако некоторые приложения должны использовать альтернативный подход по одной из следующих причин:
- Если вы используете размещенный в Apple контент, восстановление завершенных транзакций дает вашему приложению объекты транзакций, которые оно использует для загрузки контента.
- Если вам требуется поддержка версий iOS, предшествующих iOS 7, где квитанция приложения недоступна, вместо этого восстановите завершенные транзакции.
- Если ваше приложение использует невозобновляемые подписки, ваше приложение отвечает за процесс восстановления.
При обновлении квитанции запрашивается последняя версия квитанции в App Store. Обновление квитанции не создает никаких новых транзакций. Хотя вам следует избегать обновления несколько раз подряд, это действие будет иметь тот же результат, что и обновление только один раз.
Восстановление завершенных транзакций создает новую транзакцию для каждой завершенной транзакции, которую сделал пользователь, по существу, воспроизводя историю для вашего наблюдателя в очереди транзакций. Пока транзакции восстанавливаются, ваше приложение поддерживает свое собственное состояние, чтобы отслеживать, почему оно восстанавливает завершенные транзакции и как оно должно обрабатывать их. Многократное восстановление создает несколько восстановленных транзакций для каждой завершенной транзакции.
Предыдущий ответ (2009-2012)
После написания вопроса и обдумывания, я нашел пару решений.
Автоматически (не рекомендуется)
Один из вариантов - записать в пользовательских настройках по умолчанию, был ли restoreCompletedTransactions
вызван (и успешно завершен) еще в приложении. Если нет, приложение вызывает его один раз при запуске. Поскольку этот флаг может храниться в том же месте, что и непотребляемые платежи, если пользовательские значения по умолчанию будут удалены позже, метод восстановления будет вызван снова при запуске приложения.
Таким образом, если существующий клиент каким-то образом выполняет новую установку приложения, он по-прежнему автоматически восстанавливает свои покупки. Если это новый клиент, который никогда ранее не запускал приложение, то операция восстановления ничего не возвращает.
В любом случае restoreCompletedTransactions
вызывается только один раз, а не при каждом запуске.
Руководство (рекомендуется)
Другой вариант - предложить покупателю кнопку «Восстановить покупки» где-нибудь, подключить ее до restoreCompletedTransactions
и позволить ему решить, когда и когда она может понадобиться.
(В комментариях ниже объясняется, почему ручное восстановление, вероятно, лучше, чем попытка сделать это автоматически.)