SKPaymentQueue updatedTransactions не вызывается

Я получаю, что "это при покупке приложения уже куплено, оно будет восстановлено бесплатно", но делегат updatedTransactions не вызывается и ничего не происходит, IAP не выполняется.

Я реализовал Restore Purchase, которая работает нормально, но как я могу запретить пользователю совершать покупку за непотребимый элемент снова? И почему делегат обновил транзакции (SKPaymentTransactionState.Restored), которые не вызываются?

Даже при покупке после удаления и повторной установки приложения это всплывающее окно.

Вот мой код. Пожалуйста, дайте мне знать, если я делаю что-то неправильно. Спасибо

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)
}

Ответ 1

Вы устанавливаете наблюдателя транзакций после вызова .restoreCompletedTransactions(), что может быть проблемой - я бы рекомендовал попробовать

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

вместо выполняемой вами реализации.

В качестве побочного примечания я вижу, что ваш исходный код добавляет наблюдателя транзакций в нескольких местах - вы можете подумать о том, чтобы попытаться уменьшить это до одного места (если это возможно!).