2012-05-14 12 views
6

Sto riscontrando qualche problema con restoreCompletedTransactions durante lo sviluppo di un'applicazione iPhone. Tutti i problemi elencati di seguito si verificano quando si lavora nell'ambiente sandbox. L'app non è ancora in vendita. È stato sviluppato con Xcode 4.3.2 in esecuzione nel simulatore 5.0 e 5.1. I problemi che ricevo sono:restoreCompletedTransactions restituisce informazioni incomplete nell'ambiente sandbox

  1. Ogni volta che si avvia l'applicazione e la chiamata a addTransactionObserver è posto, updatedTransactions si chiama con una transazione viene acquistato. Su ogni callback il mio codice chiama finishTransaction: per completare l'acquisto, eppure questo problema continua a verificarsi ogni volta che avvio l'applicazione. Arriva una conferma esattamente per lo stesso acquisto.
  2. Invocare [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] non elenca tutti gli articoli non di consumo acquistati con l'account. Ho 2 acquisti di articoli non consumabili e solo 1 viene restituito ogni volta. Se provo ad acquistare l'articolo mancante nell'elenco, riceverò un messaggio che indica che l'oggetto è già stato acquistato. L'elemento mancante nella lista NON è quello per cui ottengo il problema 1 (elencato sopra).

A questo punto sono completamente bloccato. La mia applicazione si basa sull'AppStore per la restituzione di informazioni su materiali non di consumo, dal momento che non stiamo salvando questi dati nei nostri server. Ma dobbiamo assicurarci che l'AppStoreKit restituisca l'elenco con TUTTI gli articoli acquistati. Non solo alcuni.

Ecco il codice in questione che sto usando per testare 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

hai provato lo stesso scenario sul dispositivo? – 8Ours

+0

Sì. Il problema si verifica sia sul dispositivo che sul simulatore. – DDRider62

risposta

0

Stai cercando di chiamare restoreCompletedTransactions ogni volta l'applicazione sta iniziando? Se si desidera un elenco di tutte le transazioni si dovrebbe fare uno SKProductsRequest

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

Se si desidera ottenere i completedTransactions e sono non ottenere indietro tutto, si prega di mostrare i registri.

0

Un SKProductsRequest ti restituirà un elenco di istanze di SKProduct. La classe SKProduct non ha letto le informazioni acquistate. Penso che tu voglia veramente utilizzare restoreCompletedTransactions e recuperare un elenco di istanze di SKPaymentTransaction. Detto questo, ho lo stesso problema con un account sandbox. Ricevo un elenco incompleto di transazioni (23 su 48). Ma se scelgo di acquistare un materiale non di consumo che viene acquistato ma non ripristinato, il negozio è un articolo già acquistato e restituirà un ripristino per quell'elemento.

Qualche fortuna risolvere questo?

+0

È passato molto tempo, ma credo di non poter risolvere il problema. È (o era al momento) un problema con l'ambiente sandbox. – DDRider62

Problemi correlati