2016-05-21 23 views
11

Otrzymuję "to, że w zakupie aplikacji zostało już kupione, zostanie ono przywrócone za darmo", ale delegat updatedTransactions nie jest wywoływany i nic się nie dzieje, IAP nie jest wykonywany.SKPaymentQueue updatedTransakcje nie nazywane

Zaimplementowałem Przywróć zakup, który działa dobrze, ale jak mogę zapobiec ponownemu zakupowi przez użytkownika elementu, który nie jest zużywalny, i czemu nie jest wywoływana aktualizacja TRANSransakcje (SKPaymentTransactionState.Restored)?

Nawet dokonanie zakupu po usunięciu i ponownym zainstalowaniu aplikacji pokazuje to okno.

Tu jest moja code.Please dać mi znać, jeśli robię wrong.Thanks cokolwiek

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

Zobacz ten link: http://stackoverflow.com/questions/26235822/in-app-purchase-in-swift-with-a-single-product Ten kod IAP dobrze mi służy. –

Odpowiedz

2

ustawiasz obserwatora transakcji po nazywając .restoreCompletedTransactions() które mogłyby być problem - polecam próbowanie

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

zamiast wdrożenia, które masz powyżej.

Na marginesie widzę, że twój oryginalny kod dodaje obserwatora transakcji w wielu miejscach - możesz rozważyć próbę zredukowania tego do jednej lokalizacji (jeśli to możliwe!).