CIFilter 中的 CIQRCodeGenerator 问题

Issue with CIQRCodeGenerator in CIFilter

我正在更新现有的应用程序以支持 iOS 12,但 CIFilter 出现了奇怪的问题。

这很简单 class 只有一个功能 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
    }
}

这个 class 在 iOS 12 之前完美运行。现在在行 if let filter = CIFilter(name: "CIQRCodeGenerator") 我总是收到零。

我花了一些时间查看 Apple 文档,但没有找到有关此问题的任何有用信息。

我对 CIFilters 知之甚少,但也许您可以尝试获取所有可能的过滤器名称:

let allFiltersNames = CIFilter.filterNames(inCategories: nil)

我找不到与 CIQRCodeGenerator 匹配的过滤器,但可能有其他名称不同的过滤器可以满足您的需要。

我也遇到过,我也试过用像QRcode这样的外部库生成二维码https://github.com/aschuch/QRCode但是二维码的图像总是零。

当我使用 iOS 12.0 (16A5308d) 从 Xcode 10.0 beta 2.

在模拟器中安装应用程序时,它是零

但是当我将它安装在物理设备 iPhone SE 中时,iOS 12 beta 4 (16A5339e) 来自相同的 Xcode (10.0 beta 2),生成了二维码完全没问题。

我还尝试使用来自同一个 Xcode (10.0 beta 2) 的 iPhone SE 和 iOS 11.4 (15F79) 并完美运行。

在Swift5

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(from: "Whosebug")