Я использую покупку в приложении для iPhone. У меня есть класс, который действует как SKProductsRequestDelegate
и SKPaymentTransactionObserver
, и все это отлично работает в текущей версии, доступной в iTunes.
Однако, после добавления нового не потребляемого продукта и тестирования его в среде Sandbox, я столкнулся с какой-то странной проблемой. Каждый раз, когда я запускаю приложение, покупка, которую я сделал вчера, появляется в списке транзакций, переданных мне paymentQueue:updatedTransactions:
, несмотря на то, что я уже вызывал [[SKPaymentQueue defaultQueue] finishTransaction:transaction]
уже (несколько раз). Это нежить!
В моей реализации paymentQueue:updatedTransactions:
у меня есть:
for (SKPaymentTransaction* transaction in transactions)
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
case SKPaymentTransactionStateRestored:
{
....
DDLog(@"Transaction for %@ occurred originally on %@.", transaction.payment.productIdentifier, transaction.originalTransaction.transactionDate);
....
Затем я обрабатываю покупку, загружаю содержимое пользователя и, наконец, другим способом, сделайте следующее:
for (SKPaymentTransaction* transaction in [[SKPaymentQueue defaultQueue] transactions])
if (([transaction.payment.productIdentifier isEqualToString:theParser.currentProductID]) &&
((transaction.transactionState==SKPaymentTransactionStatePurchased) || (transaction.transactionState==SKPaymentTransactionStateRestored))
)
{
DDLog(@"[[ Transaction will finish: product ID = %@; date = %@ ]]", transaction.payment.productIdentifier, transaction.transactionDate);
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
Как вы, возможно, заметили, я не стремлюсь к оригинальному объекту транзакции ради простоты, и относительно легко найти его позже из вызова [[SKPaymentQueue defaultQueue] transactions]
. Несмотря на это, я действительно вижу ожидаемый результат; что транзакция завершена и что она точно соответствует идентификатору продукта и дате первоначальной транзакции. Однако, в следующий раз, когда я запустил приложение, все начнется! Он, как и iTunes Store, никогда не был уведомлен о завершении транзакции или отказывается признать его.