Я использую проверку подтверждения на стороне сервера.
Когда клиент
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions
а transactionState - SKPaymentTransactionStatePurchased,
клиент отправляет квитанцию на наш сервер,
и наш сервер проверяет его.
Когда проверка подтверждения на стороне сервера завершается успешно,
клиент явно вызывает finishTransaction, без проблем.
Когда проверка подтверждения на стороне сервера не удалась, потому что apple временно возвратил non json, или клиент отправил недопустимую квитанцию или что-то еще, сервер возвращает эту информацию клиенту.
Далее, что должен делать наш клиент?
Должны ли мы называть finishTransaction?
Это приводит к недействительным транзакциям, живущим вечно в очереди? как сказал в этом вопросе: покупка iPhone в приложении: проверка квитанции
Но если вы обнаружите, что квитанция недействительна, вы должны завершить связанную транзакцию. Если нет, у вас могут быть дополнительные транзакции, живущие вечно в очереди транзакций. Это означает, что каждый раз, когда ваше приложение запускается, paymentQueue: updatedTransaction: будет вызываться один раз за транзакцию...
Но если мы делаем finishTransaction, наш ценный пользователь заряжается этой квитанцией (которую мы не смогли проверить), правильно?
Или истекает ли транзакция с подтверждением проверки в течение определенного периода?
Является ли это документированным где-то в документе Apple? Я не мог найти никого в http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html