iOS不能直接用HTML5生成二维码,实际依赖JavaScript库(如qrcode.js)在WKWebView中绘制Canvas/SVG;原生推荐使用CIFilter("CIQRCodeGenerator"),需ISO-8859-1编码、缩放CIImage并校正方向。

iOS里不能直接用HTML5生成二维码?
HTML5本身不提供二维码生成功能,所谓“HTML5生成二维码”实际是靠JavaScript库(比如qrcode.js或qr-code-generator)在网页中绘制Canvas或SVG。iOS原生App调用这类能力,必须通过WKWebView加载含JS二维码逻辑的HTML页面——不是iOS系统API,而是Web方案嵌入。
WKWebView中加载本地HTML+JS生成二维码
这是最常用、可控性最强的做法。把生成逻辑完全交给前端,iOS只负责展示和传参。
- 把
qrcode.min.js和一个简单HTML(含)放在Xcode工程的Bundle Resources里 - 用
WKWebView加载本地HTML:let url = Bundle.main.url(forResource: "qrcode", withExtension: "html")! webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent())
- 用
evaluateJavaScript(_:completionHandler:)向页面传入内容:webView.evaluateJavaScript("generateQRCode('\(text)')"),前提是HTML里已定义好generateQRCode函数 - 注意:iOS 14+对
file://协议限制变严,必须用allowingReadAccessTo:指定可读路径,否则JS无法加载本地资源或报DOMException: The operation is insecure
原生Swift生成再转成UIImage,比Web更稳
如果只是要一张图,别折腾WebView。iOS原生有CIFilter(name: "CIQRCodeGenerator"),速度快、无依赖、兼容性好(iOS 8+)。
- 输入字符串需先转成
NSData并用iso-8859-1编码(UTF-8可能出错):text.data(using: .isoLatin1)!
- 滤镜输出是
CIImage,默认尺寸很小(约30×30像素),必须手动缩放:ciImage.transformed(by: CGAffineTransform(scaleX: 10, y: 10))
- 生成后转
UIImage时注意方向:CIImage坐标系Y轴向上,UIImage向下,要用.oriented(.up)避免倒置 - 不用引入任何第三方库,也不依赖网络或JS执行环境,适合离线场景或对启动速度敏感的App
常见坑:Canvas导出图片在iOS上模糊或空白
如果坚持用WebView方案,Canvas生成后调toDataURL()取图片base64,在iOS上容易失败:
立即学习“前端免费学习笔记(深入)”;
-
toDataURL("image/png")在某些WKWebView版本返回空字符串——改用toBlob()+FileReader读取更可靠 - Canvas未设置
width/height属性(仅CSS设大小),会导致渲染模糊;必须显式写canvas.width = 200; canvas.height = 200; - iOS Safari对
canvas.toDataURL()有MIME类型校验,传"image/jpeg"可能被拒绝,统一用"image/png" - WKWebView默认禁用
localStorage等API,若JS库依赖它(如某些老版qrcode.js),需在WKWebViewConfiguration里开启:configuration.websiteDataStore = .nonPersistent()
CIQRCodeGenerator的inputCorrectionLevel参数容易被忽略,默认是L(7%容错),但扫不出码时,不妨试试M或Q——不是所有扫码器都严格遵循标准。










