2016-07-19 2 views
2

Ein (ehrlicher) Benutzer hat mir gerade mitgeteilt, dass es möglich ist, den In-App-Kauf meiner App durch einfaches Drücken der RESTORE-Taste zu "kaufen". App-Kauf wurde nicht gekauft. Dies ist der Code Ich verwende (dass ich dachte, es war ausreichend ... aber ich war falsch):Wiederherstellen von In-App-Käufen Fehler: Wiederherstellen, auch wenn nicht gekauft

- (IBAction) restore { 

      [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
      [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
    } 


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

    for (SKPaymentTransaction *transaction in transactions) { 

     switch(transaction.transactionState){ 

      case SKPaymentTransactionStatePurchasing: 

       NSLog(@"Transaction state -> Purchasing ..."); 

       break; 

      case SKPaymentTransactionStatePurchased: 

       NSLog(@"Transaction state -> Purchased"); 

       [self activatePurchase]; 

       [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

       break; 

      case SKPaymentTransactionStateRestored: 

       NSLog(@"Transaction state -> Restored"); 

       [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 


       break; 

      case SKPaymentTransactionStateFailed: 

       NSLog(@"Transaction state -> Cancelled"); 

       if(transaction.error.code == SKErrorPaymentCancelled) { 

        //the user cancelled the payment ;(
       } 

       [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

       break; 

      case SKPaymentTransactionStateDeferred: 

       NSLog(@"Transaction state -> Deferred"); 

       break; 
     } 
    } 
} 




- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 

    [self activatePurchase]; 

} 

Gibt es etwas, was ich vermisst habe?

+0

mit 'if (SKPaymentQueue.canMakePayments()) { SKPaymentQueue.defaultQueue() restoreCompletedTransactions() .}' Arbeitete für mich – WMios

Antwort

1

Die Zahlungsbeobachtermethode paymentQueueRestoreCompletedTransactionsFinished wird aufgerufen, wenn die Zahlungswarteschlange beendet wurde, um Transaktionen wiederherzustellen, unabhängig davon, ob Transaktionen tatsächlich wiederhergestellt wurden. Sie erhalten einen Anruf an paymentQueueRestoreCompletedTransactionsFinished jedes Mal, wenn Sie restoreCompletedTransactions anrufen, selbst wenn es 0 Anrufe zu updatedTransactions gab.

Als Ergebnis rufen Sie activatePurchase, auch wenn es keinen Kauf gab.

Der korrekte Ort, um den Kauf zu aktivieren, ist im SKPaymentTransactionStateRestored Fall in updateTransactions; genau wie Sie für den Fall SKPaymentTransactionStatePurchased tun.

+0

I 'activatePurchase' zu' SKPaymentTransactionStateRestored' verschoben haben, aber es scheint 'paymentQueue: Warteschlange updatedTransactions : transactions' wird niemals aufgerufen, selbst wenn '[[SKPaymentQueue defaultQueue] addTransactionObserver: self];' in '- (IBAction) restore 'vorhanden ist. – Corrado

+0

Haben Sie einen Kauf, um diesen Testbenutzer wiederherzustellen? – Paulw11

+0

Meine Schuld ... Ich habe den falschen Account benutzt! Kann ich Sie fragen, ob ich irgendwie feststellen kann, dass nichts wiederhergestellt werden kann (um dem Benutzer ein Feedback zu geben)? – Corrado

Verwandte Themen