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

Я имею в виду, должны ли мои шаги быть?

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

Это то, что я делаю:

  1. Приложение отправляет запрос на загружаемый контент с квитанцией в качестве аргумента.

  2. Сервер проверяет квитанцию с помощью iTunes и, если она действительна, возвращает купленный контент в качестве тела ответа на исходный запрос.

Таким образом, даже если двоичный файл приложения взломан/изменен, содержимое загружается только на основании действительной квитанции (поскольку никакие изменения, внесенные в клиентское приложение, не могут помешать работе моего сервера и Apple).

Ответ 3

Сначала я проверил бы. Требуется 2-3 секунды. Вы можете использовать ReceiptKit https://github.com/maciekish/ReceiptKit для этой цели.