Восстановление купленных продуктов
Пользователи восстанавливают транзакции для поддержания доступа для удовлетворения, они уже купили. Например, когда они обновляют до нового телефона, они не теряют все элементы, которые они купили по старому телефону. Включайте некоторый механизм в свое приложение, чтобы позволить пользователю восстановить их покупки, такие как кнопка Restore Purchases. Восстановление покупок запрашивает учетные данные App Store пользователя, прерывающие поток Вашего приложения: из-за этого автоматически не восстанавливайте покупки, особенно не каждый раз, когда Ваше приложение запускается.
В большинстве случаев все Ваше приложение должно сделать, обновить его получение и поставить продукты в его получении. Обновленное получение содержит запись покупок пользователя в этом приложении на этом устройстве или любом другом устройстве. Однако некоторые приложения должны проявить альтернативный подход по одной из следующих причин:
При использовании размещенного Apple содержания восстановление завершенных транзакций дает приложение, транзакция возражает, что это использует для загрузки содержания.
Если необходимо поддерживать версии iOS ранее, чем iOS 7, где получение приложения не доступно, восстановление завершило транзакции вместо этого.
Если Ваше использование приложения, невозобновляющее подписки, Ваше приложение ответственно за процесс восстановления.
Обновление получения просит у App Store последнюю копию получения. Обновление получения не создает новых транзакций. Несмотря на то, что необходимо избежать обновляться многократно подряд, это действие имело бы тот же результат как обновление его только один раз.
Восстановление завершенных транзакций создает новую транзакцию для каждой завершенной транзакции сделанный пользователь, по существу воспроизводящая история для Вашего наблюдателя очереди транзакции. В то время как транзакции восстанавливаются, Ваше приложение поддерживает свое собственное состояние для отслеживания то, почему оно восстанавливает завершенные транзакции и как оно должно обработать их. Восстановление многократно создает многократные восстановленные транзакции для каждой завершенной транзакции.
Дайте пользователю надлежащий уровень управления тем, какое содержание повторно загружается. Например, не загружайте ценность трех лет ежедневных газет или сотни ценности мегабайтов игровых уровней одновременно.
Обновление получения приложения
Создайте запрос обновления получения, установите делегата и запустите запрос. Запрос поддерживает дополнительные свойства для получения получений в различных состояниях во время тестирования, таких как истекшие получения — для подробных данных, посмотрите значения для initWithReceiptProperties:
метод SKReceiptRefreshRequest
.
request = [[SKReceiptRefreshRequest alloc] init]; |
request.delegate = self; |
[request start]; |
После того, как получение обновляется, исследуйте его и поставьте любые добавленные продукты.
Восстановление завершенных транзакций
Ваше приложение запускает процесс путем вызова restoreCompletedTransactions
метод SKPaymentQueue
. Это отправляет запрос к App Store для восстановления всех завершенных транзакций приложения. Если Ваше приложение устанавливает значение для applicationUsername
свойство его платежных требований, как описано в Обнаружении Неправильного Действия, использует restoreCompletedTransactionsWithApplicationUsername:
метод для предоставления той же информации при восстановлении транзакций.
App Store генерирует новую транзакцию для каждой ранее завершенной транзакции. Восстановленная транзакция имеет ссылку на исходную транзакцию: экземпляры SKPaymentTransaction
имейте a originalTransaction
свойство и записи в получении имеют поле Original Transaction Identifier.
Вашего наблюдателя очереди транзакции вызывают с состоянием SKPaymentTransactionStateRestored
для каждой восстановленной транзакции, как описано в Ожидании App Store для Обработки Транзакций. Меры, которые Вы принимаете в этой точке, зависят от проекта Вашего приложения.
Если Ваше приложение использует получение приложения и не имеет размещенного Apple содержания, этот код не необходим, потому что Ваше приложение не восстанавливает завершенные транзакции. Закончите любые восстановленные транзакции сразу.
Если Ваше приложение использует получение приложения и разместило Apple содержание, позвольте пользователю выбрать который продукты восстановить прежде, чем запустить процесс восстановления. Во время восстановления повторно загрузите выбранное пользователями содержание и сразу закончите любые другие транзакции.
NSMutableArray *productIDsToRestore = <# From the user #>;
SKPaymentTransaction *transaction = <# Current transaction #>;
if ([productIDsToRestore containsObject:transaction.transactionIdentifier]) {
// Re-download the Apple-hosted content, then finish the transaction
// and remove the product identifier from the array of product IDs.
} else {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
Если Ваше приложение не использует получение приложения, оно исследует все завершенные транзакции, поскольку они восстанавливаются. Это использует подобный путь выполнения кода к исходной логике закупки для предоставления доступа к продукту доступным и затем заканчивает транзакцию.
Приложения с больше, чем несколькими продуктами, особенно продукты со связанным содержанием, позволяют пользователю выбрать который продукты восстановить вместо того, чтобы восстановить все одновременно. Эти приложения отслеживают, которых должны быть обработаны завершенные транзакции, поскольку они восстанавливаются и какие транзакции могут быть проигнорированы путем окончания их сразу.