2012-06-20 12 views
12

Apple ha purtroppo rifiutato la mia app per non avere un pulsante di ripristino. Volevo avere un'esperienza perfetta per l'utente ma ci sono alcuni problemi.Pulsante di ripristino per acquisto in-app iOS non consumabile

- (void)purchaseProUpgrade 
{ 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    // User is prompted for iTunes username and password here (1) 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

// Then this delegate Function Will be fired 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    if(queue.transactions.count == 0) { 

     [self setUpgradeProductId]; 

     // User is prompted for iTunes username and password here (2) 
     SKPayment *payment = [SKPayment paymentWithProductIdentifier:kInAppPurchaseProUpgradeProductId]; 
     [[SKPaymentQueue defaultQueue] addPayment:payment];                 

    }else { 

     [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:NULL]; 
    } 
    } 

È una buona soluzione? La logica sarebbe:

  1. L'utente preme il pulsante per rimuovere l'acquisto in-app.
  2. Verificare se l'utente ha già effettuato un acquisto (l'utente deve inserire nome utente e password)
  3. Se l'utente ha già effettuato un acquisto, il ripristino
  4. Se l'utente non ha già fatto un acquisto, richiede per il pagamento (user deve inserire nuovamente la password).

I problemi con questo approccio sono: 1. Una chiamata server aggiuntivo 2. L'utente deve inserire i dati due volte.

Qualcuno ha effettivamente implementato un pulsante Ripristina che può dimostrare?

+0

Perché dovresti disporre di un pulsante per l'utente per rimuovere un acquisto in-app? Una disinstallazione dell'app lo farà. Come faresti il ​​tuo passo # 2 senza forzare un nome utente e una password? – whatchamacallit

+0

Come faccio a sapere se visualizzare o meno il pulsante di ripristino? Cioè, il mio codice non sa se hanno già effettuato un acquisto. O lo fa? –

risposta

11

Non c'è bisogno di implementare la propria logica Basta implementare questo

- (IBAction)restorePreviousTransaction:(id)sender { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

Questo chiamerà questo metodo

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    case SKPaymentTransactionStateRestored: 
       if ([self respondsToSelector:@selector(restoreTransaction:)]) { 
        [self restoreTransaction:transaction]; 
        return;     
} 

Ciò chiamare questi metodi delegato per il successo dell'operazione o il fallimento

- (void)restoreTransaction:(SKPaymentTransaction *)transaction 
-(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
+0

ho riscontrato un problema. quando premo il pulsante di ripristino e utilizzo l'ID appstore con il quale non viene effettuato l'acquisto in-app, in questo caso - (void) paymentQueue: (SKPaymentQueue *) coda restoreCompletedTransactionsFailedWithError: l'errore (NSError *) non viene chiamato. è normale o qualcosa non va? – Tornado

+1

Sì, è normale. Invece chiamerà ** - (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *) coda ** con 0 in 'SKPaymentQueue' ie coda. – Sumanth

+0

È necessario verificare che il valore della coda sia 0 o non – Sumanth

7

Aggiungi questo codice alla pagina in cui hai aggiunto il ripristino pulsante:

0

Apple rifiuta l'applicazione con In App Purchase, che non ha un pulsante di acquisto di ripristino. Nella vista dell'app, aggiungi un pulsante di ripristino. Poi nella classe helper di acquisto In App, aggiungere il seguente metodo:

- (void)restoreCompletedTransactions { 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 

Ora chiamare questo metodo dall'azione pulsante di scatto e sarà ripristinare il precedente acquisto.

0
*- (IBAction)restorePreviousTransaction:(id)sender { 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 
delegate method call: 
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 
{ 
    case SKPaymentTransactionStateRestored: 
       if ([self respondsToSelector:@selector(restoreTransaction:)]) { 
        [self restoreTransaction:transaction]; 
        return;     
} 
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{ 
    purchasedItemIDs = [[NSMutableArray alloc] init]; 
    NSLog(@"received restored transactions: %i", queue.transactions.count); 
    for (SKPaymentTransaction *transaction in queue.transactions) 
    { 
     NSString *productID = transaction.payment.productIdentifier; 
     [purchasedItemIDs addObject:productID]; 
     NSLog(@"%@",purchasedItemIDs); 
    } 
}* 
Problemi correlati