Помогите разобраться почему ошибка Thread 1: signal SIGABRT во встроенных покупках


#1

Многократно реализованный метод из курса о встроенных покупках со swiftbook при тестировании примерно на 3 или 4 покупке падает с сообщением Thread 1: signal SIGABRT в консоли при этом:

2019-07-12 20:01:33.032992+0600 WebViewGold[340:9504] -[NSConcreteNotification _fastCStringContents:]: unrecognized selector sent to instance 0x2802ca880

2019-07-12 20:01:33.034624+0600 WebViewGold[340:9504] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteNotification _fastCStringContents:]: unrecognized selector sent to instance 0x2802ca880'

*** First throw call stack:

(0x1ff44927c 0x1fe6239f8 0x1ff365ab8 0x1ff44eac4 0x1ff45075c 0x22d682ad4 0x22d682bcc 0x22d89bcf4 0x102aff284 0x1ff3ba318 0x1ff3ba2e4 0x1ff3b97d8 0x1ff3b9484 0x1ff332d64 0x1ff3b8f34 0x1ffda17f4 0x102adf294 0x102ade7a0 0x102adf50c 0x1038876f0 0x103888c74 0x1038966fc 0x1ff3dac1c 0x1ff3d5b54 0x1ff3d50b0 0x2015d579c 0x22bd83978 0x102b135bc 0x1fee9a8e0)

libc++abi.dylib: terminating with uncaught exception of type NSException

(lldb)

Ошибка исчезает если из метода

public func setupPurchases(callback: @escaping(Bool) -> ()) {
    if SKPaymentQueue.canMakePayments() {
        paymentQueue.add(self)
        callback(true)
        return
    }
    callback(false)
}

убрать строку
paymentQueue.add(self)

при этом на симуляторе работает, если установить на новое устройство - тоже сначала работает потом перестает.

весь класс менеджера выглядит

Так
import Foundation
import StoreKit

class IAPManager: NSObject {
    
    static let productNotificationIdentifier = "IAPManagerProductIdentifier"
    static let shared = IAPManager()
    private override init() {}
    
    var products: [SKProduct] = [] 
    let paymentQueue = SKPaymentQueue.default()
    
    
    public func setupPurchases(callback: @escaping(Bool) -> ()) {
        if SKPaymentQueue.canMakePayments() {
            paymentQueue.add(self)
            callback(true)
            return
        }
        callback(false)
    }
    
    public func getProducts() {
        let identifiers: Set = [
            IAppPProducts.product24.rawValue,
            IAppPProducts.product6.rawValue,
            IAppPProducts.product7.rawValue,
        ]
    
        let productRequest = SKProductsRequest(productIdentifiers: identifiers)
        productRequest.delegate = self
        productRequest.start()
        
    }
    
    public func purchase(productWhith identifier: String) {
        guard let product = products.filter({ $0.productIdentifier == identifier }).first else { return }
        let payment = SKPayment(product: product)
        paymentQueue.add(payment)
    }
    
    public func restoreCompletedTransaction() {
        paymentQueue.restoreCompletedTransactions()
    }
}


extension IAPManager: SKPaymentTransactionObserver {
    func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case .deferred: break
            case .purchasing: break
            case .failed: failed(transaction: transaction)
            case .purchased: completed(transaction: transaction)
            case .restored: restored(transaction: transaction)
            }
        }
    }
    
    private func completed(transaction: SKPaymentTransaction) {
        
        NotificationCenter.default.post(name: NSNotification.Name(transaction.payment.productIdentifier), object: nil)
        paymentQueue.finishTransaction(transaction)
    }
    
    private func restored(transaction: SKPaymentTransaction) {
        paymentQueue.finishTransaction(transaction)
    }
    
    private func failed(transaction: SKPaymentTransaction) {
        if let transactionError = transaction.error as NSError? {
            if transactionError.code != SKError.paymentCancelled.rawValue {
                print("Error transaction filed case \(transaction.error!.localizedDescription)")
            }
        }
        paymentQueue.finishTransaction(transaction)
    }
}


extension IAPManager: SKProductsRequestDelegate {
    func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
        self.products = response.products
        products.forEach {print($0.localizedTitle)}
        
        if products.count > 0 {
            NotificationCenter.default.post(name: NSNotification.Name(IAPManager.productNotificationIdentifier), object: nil)
        }
    }
}

Метод setupPurchases вызывается в AppDelegate -> didFinishLaunchingWithOptions
Буду благодарен за любые идеи
Приложение с устройства удалял, Product -> clean - делал, все перезагружал…