restoreCompletedTransactions возвращает неполную информацию в изолированной среде

У меня возникли проблемы с восстановлениемзавершенных транзакций при разработке приложения для iPhone. Все перечисленные ниже проблемы возникают при работе в изолированной среде. Приложение еще не продается. Он разрабатывается с Xcode 4.3.2, работающим в симуляторе 5.0 и 5.1. Проблемы, которые я получаю:

  1. Каждый раз, когда запускается приложение и размещается вызов addTransactionObserver, обновляются транзакции с покупаемой транзакцией. При каждом обратном вызове мой код вызывает finishTransaction: для завершения покупки, и все же эта проблема продолжает происходить каждый раз, когда я запускаю приложение. Приходит подтверждение точно такой же покупки.
  2. При вызове [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] не будут перечислены все непотребляемые товары, приобретенные с помощью учетной записи. У меня есть 2 покупки непотребляемых товаров, и только 1 возвращается каждый раз. Если я попытаюсь приобрести товар, отсутствующий в списке, я получу сообщение о том, что товар уже был куплен. Недостающий пункт в списке НЕ тот, за который я получаю проблему 1 (перечисленную выше).

В этот момент я полностью застрял. Мое приложение полагается на AppStore для возврата информации о непотребляемых материалах, так как мы не сохраняем эти данные на наших собственных серверах. Но нам нужно убедиться, что AppStoreKit возвращает список со ВСЕМИ приобретенными товарами. Не только некоторые.

Вот соответствующий код, который я использую для тестирования restoreCompletedTransactions:

- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    NSLog(@"updatedTransactions started. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
    NSLog(@"Number of transactions received: %d.", [transactions count]);
    int count = 0;
    for (SKPaymentTransaction *trans in transactions)
{
    NSLog(@"Data for transaction %d: ", ++count);
    NSString *transId = [trans transactionIdentifier];
    switch ([trans transactionState])
    {
        case SKPaymentTransactionStatePurchasing:
            NSLog(@"Purchasing transaction: %@", transId);
            if (transId == nil)
            {
                NSLog(@"    Original transaction Id: %@", [[trans originalTransaction] transactionIdentifier]);
            }

            NSLog(@"     No action taken in update");
            break;
        case SKPaymentTransactionStateFailed:
            NSLog(@"Purchase transaction failed for transaction %@", transId);
            NSLog(@"     Error %d (%@)", [[trans error] code], [[trans error] localizedDescription]);
            NSLog(@"     Action Taken:  finish transaction.");
            [queue finishTransaction: trans];
            break;
        case SKPaymentTransactionStatePurchased:
            NSLog(@"Purchased transaction %@", transId);
            NSLog(@"     Purchased qty %d of  product %@", [[trans payment] quantity], [[trans payment] productIdentifier]);
            NSLog(@"     Action: called [queue finishTransaction:] to complete purchase");
            [queue finishTransaction: trans];
            break;
        case SKPaymentTransactionStateRestored:
        {
            SKPayment *paym = [trans payment];
            SKPaymentTransaction *origTrans = [trans originalTransaction];
            SKPayment *origPayment = [[trans originalTransaction] payment];
            NSLog(@"Transaction restored: %@ with original transaction %@", transId, [[trans originalTransaction] transactionIdentifier]);
            NSLog(@"     TRANSACTION DATA:");
            NSLog(@"           purchased %d of product %@ on %@.", 
                  [paym quantity], 
                  [paym productIdentifier], 
                  [[trans transactionDate] description]);

            NSLog(@"     ORIGINAL TRANSACTION DATA:");
            NSLog(@"           purchased %d of product %@ on %@.", 
                  [origPayment quantity], 
                  [origPayment productIdentifier], 
                  [[origTrans transactionDate] description]);

            NSLog(@"     No action taken.");
            break;
        }

        default:
            NSLog(@"Unexpected transaction state:  %d", [trans transactionState]);
            NSLog(@"     No action taken.");
            break;
    }
}

NSLog(@"");
NSLog(@"updatedTransactions ended. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"Restore completed transactions finished.");
NSLog(@"     Number of transactions in queue:  %d", [[queue transactions] count]);
for (SKPaymentTransaction *trans in [queue transactions])
{
    NSLog(@"          transaction id %@ for product %@.", [trans transactionIdentifier], [[trans payment] productIdentifier]);
    NSLog(@"          original transaction id: %@ for product %@.", [[trans originalTransaction] transactionIdentifier],
          [[[trans originalTransaction] payment]productIdentifier]);
    }
NSLog(@"");
}

// Method to restore transactions when user clicks button in application
- (void) onRestoreCompletedTransactions:(id)sender
{
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
6
задан DDRider62 14 May 2012 в 17:28
поделиться