Подтвердить что ты не робот

Синхронизация расходуемой покупки внутри приложения с сервером

Я пытаюсь найти лучший способ убедиться, что пользователь не потеряет расходные материалы при покупке приложения.

Тем не менее, я начинаю чувствовать себя qaru.site/info/44755/....

После полной транзакции я хочу отправить серверу, который пользователь купил в приложении. Однако соединение может потерпеть неудачу в этот момент (сервер не работает или пользователь теряет соединение).

Я рассматривал в этом сценарии отправку квитанции, как только соединение может быть сделано снова. Однако, из чего я прочитал, что квитанция содержит все в покупках приложений, и я не могу отправить только квитанцию ​​для последнего купленного товара.

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

4b9b3361

Ответ 1

Решение состоит в том, чтобы не вызывать

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

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

После синхронизации транзакции с сервером. Вы можете позвонить -finishTransaction:. См. "Завершение транзакции" в документах:

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW3

ИЗМЕНИТЬ

Таким образом, пользователь заряжается Apple, и Apple отправляет вам объект SKPaymentTransaction, который представляет транзакцию. Если свойство transactionState этой транзакции SKPaymentTransactionStatePurchased, то это означает, что Apple обработала платеж, и пользователь был списал.

Как только вы получили этот объект SKPaymentTransaction из paymentQueue, вы доставляете контент пользователю и синхронизируете транзакцию с вашим сервером. Как только оба из них успешно завершены, вы вызываете -finishTransaction. Вызов -finishTransaction сообщает StoreKit, что вы успешно выполнили все, что вам нужно сделать. -finishTransaction - синхронный вызов, вы возвращаете ответственность за StoreKit, и вам не нужно беспокоиться о том, как это передается в iTunes/Apple, StoreKit обрабатывает все это для вас.

Вы не должны называть -finishTransaction, пока не сделаете все, что вам нужно. Если что-то пойдет не так (аккумуляторная батарея устройства, потеря подключения к Интернету, авария приложения), вы получите тот же SKPaymentTransaction из очереди платежей в следующий раз, когда ваш наблюдатель будет зарегистрирован в очереди, и попробуйте снова синхронизировать с вашим сервером, Это будет продолжаться, пока вы не назовете -finishTransaction.

Существует сценарий, когда пользователь никогда не может синхронизироваться с вашим сервером, никогда не подключается к Интернету снова и т.д. Это не под вашим контролем, и в этот момент Apple должна решить, взимают ли они пользователя.

Также стоит отметить, что пользователь может связаться с Apple и запросить возврат средств, если они того пожелают.