Проблема с CIQRCodeGenerator в CIFilter

Я обновляю существующее приложение для поддержки iOS 12, и появляется странная проблема с CIFilter.

Это простой класс с одной функцией generate():

class QRGenerator {
    static func generate(from string: String) -> UIImage? {
        let context = CIContext()
        let data = string.data(using: String.Encoding.ascii)

        if let filter = CIFilter(name: "CIQRCodeGenerator") {
            filter.setValue(data, forKey: "inputMessage")
            let transform = CGAffineTransform(scaleX: 7, y: 7)
            if let output = filter.outputImage?.transformed(by: transform), let cgImage = context.createCGImage(output, from: output.extent) {
                return UIImage(cgImage: cgImage)
            }
        }
        return nil
    }
}

Этот класс отлично работает до iOS 12. Теперь в строке if let filter = CIFilter(name: "CIQRCodeGenerator") я всегда получаю nil.

Я потратил некоторое время на документацию Apple, но не нашел никакой полезной информации об этой проблеме.


person Oleg Gordiichuk    schedule 18.06.2018    source источник
comment
Буду признателен, если вы объясните, почему этот вопрос должен быть закрыт.   -  person Oleg Gordiichuk    schedule 18.06.2018
comment
Замените строку объекта данных ниже строки. let data = string.data(используя: String.Encoding.isoLatin1, allowLossyConversion: false)   -  person Deepak Saki    schedule 30.10.2018


Ответы (3)


Я очень мало знаю о CIFilters, но, может быть, вы могли бы попытаться получить все возможные имена фильтров:

let allFiltersNames = CIFilter.filterNames(inCategories: nil)

Я не смог найти тот, который соответствует CIQRCodeGenerator, но может быть есть какой-то другой фильтр с другим именем, который подойдет вам.

person user1046037    schedule 18.06.2018
comment
Как вы думаете, это ошибка Apple? Потому что в документации мы видим, что этот фильтр существует. - person Oleg Gordiichuk; 20.06.2018
comment
У вас есть ссылка на документацию? Также проверьте, предназначена ли она для документации Xcode 10. Вы можете отправить отчет об ошибке или Apple TSI, чтобы запросить дополнительную информацию об этом. - person user1046037; 20.06.2018
comment
См.: stackoverflow.com/questions /44683242/ это заказное решение - person user1046037; 20.06.2018
comment
Я знаю очень мало, но думаю, что AVCapture можно использовать hackingwithswift.com/example-code/media/how-to-scan-a-qr-code - person user1046037; 20.06.2018
comment
Этот ответ касается сканирования QR-кода, а вопрос касается генерации QR-кода. Проголосовали против. - person inket; 27.06.2018
comment
Привет @ user1046037 этот код вызывает сбой приложения. xCode 11.4.1, iPhone 11, XR. Но это нормально для всех других iPhone. Есть идеи? Как вы думаете, с более ранней версией xCode это будет работать? - person benhi; 07.05.2020
comment
Я не уверен, что вы могли бы спросить на форумах разработчиков Apple. - person user1046037; 05.06.2020

Это происходит и со мной, я также пытался сгенерировать QR с помощью внешней библиотеки, такой как QRcode https://github.com/aschuch/QRCode, но изображение QR всегда равно нулю.

Это ноль, когда я устанавливаю приложение в эмуляторах с iOS 12.0 (16A5308d) из Xcode 10.0 beta 2.

Но когда я устанавливаю его на физическое устройство iPhone SE с iOS 12 beta 4 (16A5339e) из того же Xcode (10.0 beta 2), QR генерируется без проблем.

Я также пробовал эмулировать iPhone SE с iOS 11.4 (15F79) из того же Xcode (10.0 beta 2), и все работает отлично.

person Sergio    schedule 01.08.2018

В Свифт 5

class QRGenerator {
    static func generate(from string: String) -> UIImage? {
        let data = string.data(using: .ascii, allowLossyConversion: false)
        let filter = CIFilter(name: "CIQRCodeGenerator")
        filter?.setValue(data, forKey: "inputMessage")
        
        return UIImage(ciImage: (filter?.outputImage)!)
    }
}

вызвать эту функцию

myImageView.image = QRGenerator.generate(из: Stackoverflow)

person Prajapati Ramesh    schedule 22.11.2020