2012-05-14 16 views
6

Mam sporo problemów z restoreCompletedTransactions podczas opracowywania aplikacji iPhone. Wszystkie problemy wymienione poniżej występują podczas pracy w środowisku piaskownicy. Aplikacja jeszcze nie sprzedaje. Jest rozwijany z Xcode 4.3.2 działającym w symulatorze 5.0 i 5.1. Problemy dostaję to:restoreCompletedTransactions zwraca niekompletne informacje w piaskownicy środowisku

  1. Za każdym razem uruchamiania aplikacji i wywołanie addTransactionObserver jest umieszczony, updatedTransactions nazywa z transakcją zakupu. Przy każdym wywołaniu zwrotnym mój kod wywołuje metodę finishTransaction: aby dokończyć zakup, a jednak ten problem ciągle występuje przy każdym uruchomieniu aplikacji. Potwierdzenie z dokładnie tego samego zakupu przychodzi.
  2. Wywoływanie [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] nie zostanie lista wszystkich non-eksploatacyjnych zakupionych przy użyciu konta. Mam 2 zakupy towarów, które nie są zużywalne, a za każdym razem zwracana jest tylko 1. Jeśli spróbuję kupić brakujący przedmiot na liście, otrzymam komunikat informujący, że przedmiot został już kupiony. Brakujący element na liście NIE jest tym, dla którego otrzymuję problem 1 (wymieniony powyżej).

W tym momencie jestem całkowicie zatrzymany. Moja aplikacja opiera się na AppStore w celu zwrócenia informacji o materiałach eksploatacyjnych, ponieważ nie zapisujemy tych danych na naszych serwerach. Ale musimy się upewnić, że AppStoreKit zwraca listę z WSZYSTKIM zakupionymi przedmiotami. Nie tylko niektóre.

Oto odpowiedni kod używam do testowania 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]; 
} 
+0

Czy przetestowałeś ten sam scenariusz na urządzeniu? – 8Ours

+0

Tak. Problem występuje zarówno na urządzeniu, jak i na symulatorze. – DDRider62

Odpowiedz

0

Próbujesz wywołać restoreCompletedTransactions każdym razem aplikacja uruchamia? Jeśli chcesz listę wszystkich transakcji jakich można dokonać SKProductsRequest

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productsSet]; 
    productsRequest.delegate = self; 
    [productsRequest start]; 

Jeśli chcesz uzyskać completedTransactions i nie wraca wszystko, proszę pokazać dzienniki.

0

SKProductsRequest dostanie z powrotem listę instancji SKProduct. Klasa SKProduct nie do mojej lektury ma zakupione informacje. Myślę, że naprawdę chcesz użyć restoreCompletedTransactions i odzyskać listę instancji SKPaymentTransaction. Powiedział, że mam taki sam problem z piaskownicowym kontem. Otrzymuję niekompletną listę transakcji (23 z 48). Ale jeśli wybiorę zakup nieużywanego, który został zakupiony, ale nie zostanie przywrócony, sklep, który jest już zakupionym przedmiotem, odeśle przywrócenie dla tego produktu.

Czy to się uda?

+0

Minęło dużo czasu, ale uważam, że nie mogłem rozwiązać problemu. To jest (lub było w tym czasie) problem ze środowiskiem piaskownicy. – DDRider62

Powiązane problemy