Многократно реализованный метод из курса о встроенных покупках со 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 - делал, все перезагружал…