Когда я должен проверить квитанцию ​​в приложении о покупке? - PullRequest
17 голосов
/ 03 апреля 2012

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

1) Получить SKPaymentTransactionStatePurchased

2) Удалите его из SKPaymentQueue и предоставьте содержимое [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

3) Подтвердите получение, а затем, если оно недействительно, заблокируйте только что предоставленный контент

Или я должен вместо этого изменить 2-й шаг на 3-й?

1) Получить SKPaymentTransactionStatePurchased

2) Проверить квитанцию, а затем, если она недействительна, не предоставлять содержимое

3) Удалить его из SKPaymentQueue в любом случае [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

В первом случае пользователь может отключить интернет сразу после покупки, поэтому я не смогу подтвердить чек. Но во втором случае могут возникнуть некоторые проблемы с Интернетом между шагами 1 и 2, поэтому я не буду завершать транзакцию и не буду предоставлять контент, который был бы плохим для пользователя.

Так какой путь вы выбрали для своего приложения и почему?

Мой выбор

Я выбрал второй сценарий, поскольку при выборе первого сценария iAP Cracker легко взламывает мое приложение.

Ответы [ 3 ]

10 голосов
/ 15 июля 2012

Сценарий 2. Если интернет взорвется, вы не получите -finishTransaction. Но это здорово, потому что вы можете повторить попытку (NSTimer), и ваше приложение получит незавершенную транзакцию при запуске. И это точно , как StoreKit предназначен для работы (хотя это не очевидно из чтения документов).

StoreKit поставляется с транзакциями по уважительной причине. Пользователь может просто выйти из приложения сразу после покупки, и вам все равно придется восстанавливаться после этого. И именно поэтому Apple рекомендует настроить наблюдателя транзакций как можно скорее в жизненном цикле приложения.

Никогда не завершайте транзакцию до предоставления контента, вам придется внедрить собственную систему транзакций поверх StoreKit, и вы не хотите этого делать, поверьте мне (я видел, как это было сделано, это была катастрофа).

Редактировать: честно говоря, вероятность того, что пользователь отключит интернет после покупки и перед проверкой, будет смехотворно низкой. Парень был в интернете секунду назад, никто не выходит, чтобы отключить интернет во время покупки. Но вполне возможно, что в этот момент пользователь прерывается и отправляет ваше приложение в фоновый режим. Ваше приложение может быть убито по любой причине, которую iOS сочтет целесообразной И когда ваши приложения запускаются снова, ваше приложение не помнит, чтобы у вас была начальная покупка, и магазинный комплект не очень поможет, поскольку вы уже завершили транзакцию.

4 голосов
/ 15 июля 2012

Вот что я делаю:

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

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

ThisКстати, даже если бинарный файл приложения взломан / изменен, контент загружается только с действительной квитанцией.

1 голос
/ 15 июля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...