Этот вопрос касается Auto-Renewable IAP и того, как они должны быть восстановлены. Эти ссылки: this и это не помогли мне, к сожалению.
В моем приложении у меня есть пользователи, подписавшиеся на Автоматически обновляемые покупки в приложениях. Они могут подписаться на 1, 6 или 12 месяцев.
Когда они подписываются, квитанция транзакции отправляется на мой сервер для проверки позже. Я не проверять получение сразу же, так как это замедлит работу пользователя (для проверки запросов на проверку ячеек для яблок мне требуется 1 - 2 секунды). Вместо этого я использую наивный подход и предоставляю контент, на который подписаны пользователи, без прямой проверки квитанции. Я планирую задание cron для проверки каждой пользовательской квитанции один раз в день и отмены привилегий при устаревших квитанциях.
Теперь, поскольку в правилах яблок четко указано, что для приложений с автоматически возобновляемыми подписками требуется функция восстановления, я решил реализовать это.
Когда я пытаюсь восстановить покупки в режиме песочницы, используя:
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
Я получаю не только текущие подписки, но и все предыдущие подписки (включая устаревшие) в обратном вызове:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
В настоящее время я пробовал свои IAP примерно 30 раз, а это означает, что указанному выше методу отправлено 30 различных транзакций (устаревших и активных). Для каждой из этих транзакций я загружаю квитанцию о транзакциях на свой веб-сервис для последующей проверки.
Теперь. В случае, если последняя транзакция имеет устаревшую квитанцию (но вторая - последняя транзакция была действительно действительна), она перезапишет текущую (действительную) квитанцию для текущего пользователя и, таким образом, отменит права пользователя для пользователя.
В основном, моя проблема заключается в том, что при вызове restoreCompletedTransactions
я получаю список как устаревших, так и активных транзакций. И на стороне сервера они могут аннулировать друг друга. Оптимально, я хотел бы получить только одну транзакцию (наиболее актуальную) и отправить ее на мой сервер для последующей проверки.
В целом, я думаю, мой главный вопрос:
Как я могу убедиться, что восстановлена только активная (то есть самая последняя) транзакция?