2013-01-13 7 views
5

Sono ripristino transazioni completate (ricorrente) conpaymentQueueRestoreCompletedTransactionsFinished: vs updatedTransactions:

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

e in

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 

ho ottenuto un elenco delle transazioni storia restaurata, fatta da l'applicazione, ma il metodo :

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 

non viene nemmeno chiamato una volta, quindi mi chiedo quale dovrei e? Ho fatto qualche ricerca e ho scoperto che il metodo updatedTransactions: dovrebbe essere usato con il controllo dello stato della transazione, ma se ho ottenuto un elenco di transazioni ripristinate, è semplicemente inutile trattarle tutte come transazioni. Quale dovrei usare? Il numero paymentQueueRestoreCompletedTransactionsFinished mi dà solo l'ultimo (l'abbonamento alla sandbox scade tra diversi minuti e ho ottenuto un elenco completo delle transazioni cronologiche effettuate durante il test, in updatedTransactions).

risposta

7

V'è un eccellente video WWDC sull'utilizzo StoreKit, è WWDC2012 Sessione 302.

Per isolare ogni acquisto, il metodo di updatedTransactions potrebbe essere simile a questa:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 

     for (SKPaymentTransaction *transaction in transactions) { 

      switch(transaction.transactionState) { 
       case SKPaymentTransactionStatePurchased: 
        // Unlock content 
        //... Don't forget to call `finishTransaction`! 
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
        break; 
       case SKPaymentTransactionStatePurchasing: 
        // Maybe show a progress bar? 
        break; 
       case SKPaymentTransactionStateFailed: 
        // Handle error 
        // You must call finishTransaction here too! 
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
        break; 
       case SKPaymentTransactionStateRestored: 
        // This is the one you want ;) 
        // ...Re-unlock content... 
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
        break; 
      } 
     } 
} 

Una volta stabilito che l'acquisto è in fase di ripristino, è possibile rendere il contenuto disponibile come meglio credi, preferibilmente chiamando un metodo separato all'interno di tale istruzione switch e passando la transazione come parametro. L'implementazione dipende da te, naturalmente.

+0

Sì, ma quello che ho ottenuto è più di 1 transazione ripristinata per lo stesso ID prodotto, quindi devo usare la transazione con il più recente transactionDate? – hzxu

+0

Hmm che non dovrebbe accadere ... Questo probabilmente significa che, in precedenza, la transazione non era stata completata con 'finishTransaction:'. Riavvolgerei la tua app (pulire la build e cancellare i dati da iOS Simulator) per sbarazzarmi delle transazioni in coda. Prima di farlo però, dove stai configurando il tuo 'TransactionObserver'? – Ephemera

+0

Forse manca un'interruzione nel caso SKPaymentTransactionStatePurchasing? – neoneye

2
  1. Chiamare [[SKPaymentQueue defaultQueue] addTransactionObserver:self] in (void)viewDidLoad o equivalente se applicabile.
  2. Quindi chiamare [[SKPaymentQueue defaultQueue] restoreCompletedTransactions].
  3. (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions verrà chiamato di conseguenza tramite (2).

Se non si chiama il metodo in (1), l'applicazione non raggiungerà mai (3) per ripristinare le transazioni in primo luogo.

+2

Sì, ho fatto 1. il problema è il metodo in 3. mi fornisce un elenco di tutte le sottoscrizioni effettuate dall'account sandbox. Ho solo bisogno di quello che viene ripristinato con successo. – hzxu

+0

@hzxu ho lo stesso problema, hai trovato qualche soluzione? –

Problemi correlati