Когда следует проверять получение транзакции на покупку в приложении?
Я имею в виду, должны ли мои шаги быть?
1) Получить SKPaymentTransactionStatePurchased
2) Удалите его из SKPaymentQueue и предоставите контент [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
3) Подтвердите получение, а затем, если оно недействительно, заблокируйте только что предоставленный контент
Или я должен изменить второй шаг на 3 вместо?
1) Получить SKPaymentTransactionStatePurchased
2) Подтвердите получение, а затем, если оно недействительно, не предоставляйте контент
3) В любом случае удалите его из SKPaymentQueue
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
В первом сценарии пользователь может отключить Интернет сразу после покупки, поэтому я не смогу подтвердить получение. Но во втором случае между шагами 1 и 2 могут возникнуть некоторые проблемы с Интернетом, поэтому я не закончу транзакцию и не буду предоставлять контент, это будет плохой пользовательский интерфейс.
Итак, каким образом вы выбрали для своего приложения и почему?
Мой выбор
Я выбрал второй сценарий, так как выбор первого делает мое приложение легко взломанным iAP Cracker.
Ответы
Ответ 1
Сценарий 2.
Если интернет взорвется, вы не дойдете до -finishTransaction.
Но это круто, потому что вы можете повторить попытку (NSTimer), и ваше приложение получит незавершенную транзакцию при запуске.
И именно то, как StoreKit предназначен для работы (хотя это не очевидно из чтения документов).
StoreKit поставляется с транзакциями по уважительной причине. Пользователь может просто закрыть приложение сразу после покупки, и вам все равно придется его восстановить.
И почему Apple рекомендует как можно скорее установить наблюдателя транзакций в жизненном цикле приложения.
Никогда не завершайте транзакцию перед предоставлением контента, вам придется реализовать свою собственную систему транзакций поверх StoreKit, и вы не хотите этого делать, поверьте мне (я видел, как это делалось, это была катастрофа).
Редактировать: честно говоря, в конечном итоге пользователь отключил Интернет после покупки и до того, как вы проверите, смехотворно низкий. Парень был в Интернете через секунду, никто не выходит, чтобы разрезать интернет в середине покупки.
Но возможно, что пользователь будет прерван в этот момент и отправит ваше приложение на задний план.
Затем ваше приложение может быть убито по какой-либо причине, по мнению iOS.
И когда вы снова запускаете приложения, хорошо, что ваше приложение не будет помнить, что у вас есть покупка, и хранить комплект не будет большой помощью, так как вы уже закончили транзакцию.
Ответ 2
Это то, что я делаю:
Приложение отправляет запрос на загружаемый контент с квитанцией в качестве аргумента.
Сервер проверяет квитанцию с помощью iTunes и, если она действительна, возвращает купленный контент в качестве тела ответа на исходный запрос.
Таким образом, даже если двоичный файл приложения взломан/изменен, содержимое загружается только на основании действительной квитанции (поскольку никакие изменения, внесенные в клиентское приложение, не могут помешать работе моего сервера и Apple).
Ответ 3
Сначала я проверил бы. Требуется 2-3 секунды. Вы можете использовать ReceiptKit https://github.com/maciekish/ReceiptKit для этой цели.