2012-04-03 7 views
15

Я имею в виду, должны ли мои шаги быть?Когда я должен проверять получение транзакции на покупку в приложении?

1) Получить SKPaymentTransactionStatePurchased

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

3) Validate квитанцию, а затем, если это инвалид, блокировать содержание, которое я только что представил

Или я должен изменить второй шаг на третий?

1) Получить SKPaymentTransactionStatePurchased

2) Сверяет квитанцию, а затем, если это инвалид, dont't обеспечить содержание

3) Удалите его из SKPaymentQueue все равно [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

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

Каким образом вы выбрали для своего приложения и почему?

Мой выбор

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

+0

Я также заинтересован в ответе на это. В настоящее время я делаю ваш первый подход, так как это лучший пользовательский интерфейс, и его все равно трудно злоупотреблять (я все время пытаюсь проверить получение в фоновом режиме) –

+0

Я также решил выбрать его для своего приложения –

+0

Вы определяете, загрузить содержимое (действительная квитанция) или нет (недопустимая квитанция) из кода приложения? Если это так, нужно только изменить «if (valid)» в «if (1)». См. Мой ответ. –

ответ

9

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

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

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

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

+0

Да, я перехожу к этому сценарию после того, как увидел, что приложение можно легко взломать с помощью iAP-взломщика. И, да, курс cof, я добавляю наблюдателя в didFinishLaunching) Спасибо за ваш ответ! –

1

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

+1

Как ReceiptKit помогает проверить вашу квитанцию ​​без проверки на вашей контролируемой серверной среде? Кажется, довольно легко взломать, не так ли? –

3

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

  1. App отправляет запрос на контент с получением прилагается.

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

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

Смежные вопросы