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

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

Наблюдения

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

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

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

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

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

Примечания

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

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


person otto    schedule 18.11.2009    source источник
comment
Сейчас я борюсь с той же проблемой. Проблема, которую я вижу, связана с пользовательским интерфейсом: при вызове restoreCompletedTransactions у пользователя сразу же запрашивается пароль iTunes без контекста, что при запуске приложения является невероятно запутанным делом, особенно для людей, которые еще не приобрели обновление. Я подумал о том, чтобы проверить его, когда отображается контроллер представления магазина, но, опять же, он сразу же запрашивает пароль, что действительно отпугнет покупателей в первый раз.   -  person Dave Verwer    schedule 28.09.2010
comment
Да, в точности мои настроения. Я действительно хотел избежать автоматического запроса у пользователей пароля учетной записи при первом запуске приложения или входе на страницу магазина. В итоге я выбрал кнопку «Восстановить покупки», которая, похоже, работает нормально. Я пока не получал никаких жалоб от клиентов или недоразумений по этому поводу.   -  person otto    schedule 28.09.2010


Ответы (3)


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

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

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

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

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

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

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

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

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


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

Написав вопрос и подумав над ним, я придумал несколько решений.

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

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

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

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

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

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

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

person otto    schedule 18.11.2009
comment
Достаточно остроумна проверка флага при запуске и автоматическое восстановление. В итоге я вставил кнопку, как и Ramp Champ. Но потом оба приложения скачивают большие файлы при совершении покупок. - person Carl Coryell-Martin; 21.11.2009
comment
Ага. Я тоже склоняюсь к тому, чтобы иметь кнопку восстановления. Что касается автоматического восстановления, я забыл принять во внимание одну очевидную вещь - то, что пользователь может запрашивать пароль своей учетной записи. Это последнее, что я хотел бы бросить в лицо пользователю при первом запуске приложения. - person otto; 24.11.2009
comment
Кнопочная штука - лучший вариант ИМХО. Это то, что делает каждое приложение, которое я вижу. - person pt2ph8; 05.04.2011
comment
Вызов RestoreTransactions покажет диалоговое окно аутентификации iTunes. Это означает, что новый пользователь не поймет, почему приложение запрашивает его пароль iTunes. - person Mugunth; 29.07.2011
comment
Мугунт Кумар: Я думаю, это недавно изменилось. В более ранних версиях iOS логин и пароль, используемые для загрузки приложения, сохранялись в течение 15 минут. Это означает, что запуск приложения в первый раз в течение 15 минут после загрузки позволит выполнить вызов restoreCompletedTransactions без каких-либо запросов. После очевидного злоупотребления этой функцией Apple изменила поведение, чтобы всегда требовать отдельной аутентификации для покупок в приложении (что вы видите). При таком новом подходе я не вижу возможности автоматически вызывать restoreCompletedTransactions без запроса. - person chris; 18.08.2011
comment
Я хочу отображать кнопку «Восстановить покупки» только при необходимости. Прямо сейчас похоже, что единственный способ проверить, нужно ли восстанавливать покупки в приложении, - это вызвать restoreCompletedTransactions, для которого требуется пароль. Есть ли способ сначала проверить? - person whatchamacallit; 26.06.2012
comment
Мне отказали в приложении из-за того, что у меня НЕ была кнопка восстановления покупок. Я думаю, что эта кнопка ДОЛЖНА быть там с самого начала. - person badweasel; 25.10.2013

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

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

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

person Craig    schedule 22.06.2011
comment
Это отличный момент, и, должно быть, именно поэтому, очевидно, требуется кнопка «восстановить покупки», под угрозой отказа в магазине приложений, если вы используете не расходные материалы. - person Reuben Scratton; 03.07.2012

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

person Mark Bridges    schedule 26.12.2012