Ответ 1
Решение состоит в том, чтобы не вызывать
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
на покупку расходного материала, пока он не будет синхронизирован с сервером. Таким образом, транзакция будет снова передана вашему наблюдателю каждый раз, когда она настроена на просмотр очереди платежей. Вам нужно будет управлять стороной приложения, будь то покупка, которая была доставлена, но не синхронизирована, или новая покупка.
После синхронизации транзакции с сервером. Вы можете позвонить -finishTransaction:
. См. "Завершение транзакции" в документах:
ИЗМЕНИТЬ
Таким образом, пользователь заряжается Apple, и Apple отправляет вам объект SKPaymentTransaction
, который представляет транзакцию. Если свойство transactionState этой транзакции SKPaymentTransactionStatePurchased
, то это означает, что Apple обработала платеж, и пользователь был списал.
Как только вы получили этот объект SKPaymentTransaction
из paymentQueue, вы доставляете контент пользователю и синхронизируете транзакцию с вашим сервером. Как только оба из них успешно завершены, вы вызываете -finishTransaction
. Вызов -finishTransaction
сообщает StoreKit
, что вы успешно выполнили все, что вам нужно сделать. -finishTransaction
- синхронный вызов, вы возвращаете ответственность за StoreKit
, и вам не нужно беспокоиться о том, как это передается в iTunes/Apple, StoreKit
обрабатывает все это для вас.
Вы не должны называть -finishTransaction
, пока не сделаете все, что вам нужно. Если что-то пойдет не так (аккумуляторная батарея устройства, потеря подключения к Интернету, авария приложения), вы получите тот же SKPaymentTransaction
из очереди платежей в следующий раз, когда ваш наблюдатель будет зарегистрирован в очереди, и попробуйте снова синхронизировать с вашим сервером, Это будет продолжаться, пока вы не назовете -finishTransaction
.
Существует сценарий, когда пользователь никогда не может синхронизироваться с вашим сервером, никогда не подключается к Интернету снова и т.д. Это не под вашим контролем, и в этот момент Apple должна решить, взимают ли они пользователя.
Также стоит отметить, что пользователь может связаться с Apple и запросить возврат средств, если они того пожелают.