You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:22:54