2016-05-21 16 views
11

Sto ricevendo "questo acquisto in app è già stato acquistato verrà ripristinato gratuitamente" ma il delegato updatedTransactions non viene chiamato e non accade nulla, l'IAP non viene eseguito.SKPaymentQueue updatedTransactions not be called

Ho implementato Restore Purchase che funziona bene, ma come faccio a impedire a un utente di effettuare nuovamente l'acquisto di un articolo non di consumo? E perché il delegate updatedTransactions (SKPaymentTransactionState.Restored) non viene chiamato?

Anche effettuare l'acquisto dopo aver eliminato e reinstallato l'applicazione mostra questo pop-up.

Ecco il mio code.Please fatemi sapere se sto facendo nulla wrong.Thanks

func makePaymentForProduct(product:SKProduct){ 
    let payment = SKPayment.init(product: product) 
    SKPaymentQueue.defaultQueue().addPayment(payment) 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
} 

func restorePurchases(){ 
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
} 


//MARK: SKProductsRequestDelegate 

func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { 
    self.delegate?.didGetProducts(response.products) 
} 

func request(request: SKRequest, didFailWithError error: NSError) { 
    self.delegate?.purchaseFailed(error.localizedDescription) 
} 

//MARK: SKPaymentTransactionObserver 

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 

    for (_, transaction) in transactions.enumerate() { 
     switch (transaction.transactionState) { 
     case SKPaymentTransactionState.Purchased: 
      self.completeTransaction(transaction) 
      break 
     case SKPaymentTransactionState.Restored: 
      self.restoreTransaction(transaction) 
      break 
     case SKPaymentTransactionState.Failed: 
      self.failedTransaction(transaction) 
      break 
     default: 
      break 
     } 
    } 
} 

func completeTransaction(transaction:SKPaymentTransaction){ 
    self.delegate?.purchaseSuccessful() 
    SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
} 

func restoreTransaction(transaction:SKPaymentTransaction){ 
    self.delegate?.purchaseSuccessful() 
    SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
} 

func failedTransaction(transaction:SKPaymentTransaction){ 
    self.delegate?.purchaseFailed("") 
    SKPaymentQueue.defaultQueue().finishTransaction(transaction) 
} 


//Restore Purchase 

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { 
    self.delegate?.purchaseRestored() 
} 

func paymentQueue(queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: NSError) { 
    self.delegate?.purchaseFailed(error.localizedDescription) 
} 
+0

Vedere questo collegamento: http://stackoverflow.com/questions/26235822/in-app-purchase-in-swift-with-a-single-product Questo codice IAP mi è servito molto bene. –

risposta

2

si sta impostando l'osservatore transazione dopo chiedono .restoreCompletedTransactions() che potrebbe essere il problema - mi consiglia provare

func restorePurchases(){ 
    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
} 

invece dell'implementazione che hai sopra.

Come nota a margine, vedo che il codice originale sta aggiungendo l'osservatore delle transazioni in più punti: si potrebbe considerare di provare a ridurlo a una sola posizione (se possibile!).

Problemi correlati