Swift 4中如何设置二维码(QRCode)版本?
控制二维码版本的解决方案
我完全懂你遇到的痛点——用CIQRCodeGenerator生成二维码时,系统确实会自动根据内容长度和纠错级别选最合适的版本,没有直接API让你指定版本。不过有两种可行的办法来搞定这个需求:
方法1:通过内容填充间接控制版本
QR码的每个版本都有固定的数据容量(不同纠错级别下容量不同),如果想强制用某个版本,可以先查好该版本对应纠错级别下的最大数据容量,给原内容填充不影响有效性的占位符,让总长度刚好触发目标版本。
举个例子,要是你想强制用版本3+M纠错级别,根据QR码规范,这个组合的最大字节容量是19字节。你可以把vCard转成Data后,补入空字节(或者合法的vCard注释内容)直到达到目标长度:
let vcard = "BEGIN:VCARD\nVERSION:3.0\nFN:John Doe\nEND:VCARD" // 将vCard转为UTF-8格式的Data guard var vcardData = vcard.data(using: .utf8) else { print("Failed to convert vCard to data") return } // 版本3 + M纠错的最大字节容量为19 let targetByteCount = 19 if vcardData.count < targetByteCount { // 补0x00字节到目标长度(如果是vCard,也可以补合法注释比如"\nNOTE:padding") let paddingCount = targetByteCount - vcardData.count let paddingData = Data(repeating: 0x00, count: paddingCount) vcardData.append(paddingData) } // 生成二维码 let filter = CIFilter(name: "CIQRCodeGenerator")! filter.setValue(vcardData, forKey: "inputMessage") filter.setValue("M", forKey: "inputCorrectionLevel") if let output = filter.outputImage { let scaleX = qrCode.frame.size.width / output.extent.size.width let scaleY = qrCode.frame.size.height / output.extent.size.height let scaledImage = output.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY)) qrCode.image = UIImage(ciImage: scaledImage) }
方法2:用支持版本指定的第三方库
如果填充法太折腾,直接用第三方库会省心很多,不少开源库都支持直接指定QR码版本,比如SwiftQRCodeGenerator或者QRCode:
以SwiftQRCodeGenerator为例,安装后可以这么写:
import SwiftQRCodeGenerator do { // 直接指定版本3,纠错级别Medium(对应原生的"M") let qrCode = try QRCode.encode( text: vcard, version: .v3, errorCorrection: .medium ) // 转成UIImage显示到视图上 qrCode.image = qrCode.uiImage } catch { print("Failed to generate QR code: \(error)") }
需要注意的是,要是你指定的版本容量小于内容长度,第三方库会抛出错误,所以得确保内容长度在目标版本的容量范围内。
内容的提问来源于stack exchange,提问作者Stephane Paquet
相关产品推荐
相关产品推荐

