Когда нам нужно обновить квитанцию iOS7, подходящий способ сделать это - использовать SKReceiptRefreshRequest. Появится диалоговое окно Apple, в котором пользователь может войти в систему, используя свой идентификатор Apple. Это также позволяет им Отменить. Как мы можем определить, нажимает ли пользователь Отмена? (Конечно, в iOS6 это можно сделать с помощью ловите событие отмены для [[SKPaymentQueue defaultQueue] restoreCompletedTransactions ]).
Объект SKReceiptRefreshRequest имеет делегат с двумя способами:
- (void)requestDidFinish:(SKRequest *)request;
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
В моем коде вызывается метод делегирования requestDidFinish, если пользователь делает или не отменяет.
Причиной для меня является то, что я хочу отменить процесс восстановления, если пользователь нажимает Отмена. Если после запроса обновления просто не было получения, это может быть относительно легко. Однако иногда к приложению SKReceiptRefreshRequest присутствует квитанция (с некоторыми покупками), и она остается в приложении, если пользователь отменяет вход из диалогового окна входа.
У меня есть две идеи, как это сделать:
1) Удалите квитанцию из пакета до запроса обновления. Очевидная проблема заключается в том, что приложение не может удалить файлы из пакета (например, см. Удалить файл из комплекта после установки). Я пытался. Нет.
2) Проверьте байты квитанции перед запросом на обновление и после; если они отличаются, то это должно указывать на то, что пользователь не нажал "Отмена" . Если они не отличаются друг от друга, я не уверен, что указывает, что они нажали Cancel. Если квитанция содержит покупки, я думаю, что байты будут отличаться, потому что обновленная квитанция должна иметь другой идентификатор транзакции (но те же "оригинальные" идентификаторы транзакции). Если квитанция не содержит покупок, я не уверен в этом.
Обновление, 11/9/15; Я только заметил, что ответ делегата на пользователя, нажав "Отмена" , по-видимому, изменился. Теперь вызывается didFailWithError. Однако проблема обнаружения аннулирования пользователя остается. Как мы можем отличить пользователя от нажатия "Отмена" и подлинной ошибки? Я тестировал iOS8.4 и iOS9.2 (бета). Я теперь сообщил об этом недостатке различимости в качестве ошибки для Apple (ошибка # 23476210).
Обновление, 11/10/15; Эта проблема не появляется в iOS 9.0.2! Я просто попробовал это сейчас со всеми тремя системами с одним и тем же бинарником приложения в том же приблизительном интервале времени (в течение 20 минут для всех трех систем): (A) iOS9.2 (13C5050d): Проблема возникает (вызывается didFailWithError и не может различать реальную ошибку и пользователь, нажимающий отменить), (B) iOS9.0.2, проблема не возникает (вызывается requestDidFinish) и (C) iOS8.4.1, проблема возникает. Со всеми тремя версиями системы это работает на реальном оборудовании, а не на симуляторе.