iOS中WKWebView加载HTML/JS实现canvas绘图,需通过evaluateJavaScript注入JS驱动已定义的绘图函数,导出时用toDataURL获取base64再转UIImage,并注意同源、devicePixelRatio适配及页面加载完成时机。
iOS 本身不直接“调用” HTML5 绘图,而是通过 WKWebView 加载并运行 HTML/JS 代码,在 Web 环境中完成绘图;原生 Swift/Objective-C 无法绕过 Web 容器直接操作 canvas 上下文。
这是最基础也最常用的路径:把绘图逻辑写在 HTML + JS 里,让 WKWebView 渲染执行。
和初始化 JS(如 getContext('2d'))loadFileURL(_:allowingReadAccessTo:) 加载本地 HTML,避免跨域限制;不要用 loadHTMLString(_:baseURL:) 加载含相对路径资源(如图片)的页面,否则 canvas 图片可能空白evaluateJavaScript(_:completionHandler:) 向已加载页面注入 JS 执行绘图命令原生层不能直接调用 canvas.getContext(),但可通过 JS 注入方式驱动已有 canvas 实例。
window.drawPoint = function(x, y) { ctx.fillRect(x, y, 2, 2); };
webView.evaluateJavaScript("drawPoint(100, 200)") { _, _ in }
webView(_:didFinishNavigation:) 回调后)再调用,否则报错 TypeError: undefined is not an object
postMessage 配合 message 事件,避免频繁 evaluate 带来的延迟用户常误以为能直接从 WKWebView 取 canvas 的像素数据,实际只能通过 JS 拿到 data URL,再由原生侧转换。

canvas.toDataURL('image/png')(注意:仅支持 PNG/JPEG,且 canvas 未跨域)evaluateJavaScript 获取该字符串,再用 Data(base64Encoded:) 解码为 UIImage
allowingReadAccessTo: 授权),否则 toDataURL() 返回空字符串width/height 属性默认是 CSS 像素,需手动设置 canvas.width = canvas.clientWidth * window.devicePixelRatio 等适配,否则导出图模糊如果核心需求是“在 iOS 上动态绘图”,而非必须用 HTML5 canvas 标准,Core Graphics 或 SwiftUI Path 是更稳定、高性能的选择。
UIGraphicsImageRenderer 可生成任意精度的 UIImage,无 WebView 启动开销和 JS 调用延迟CALayer 或 SKView 更适合实时渲染场景canvas 在 iOS 上始终运行于 WebKit 的 JSContext 中,所有操作都绕不开页面生命周期、同源策略和 devicePixelRatio 适配——这些不是“调用接口”的问题,而是环境约束。真正卡住的往往不是语法,而是 base64 编码失败、devicePixelRatio 忘设、或 evaluateJavaScript 过早触发。