iOS 12.4.8真机上WKWebView无法加载本地HTML内容问题求助
iOS 12.4.8 环境下 WKWebView 本地HTML加载失败问题修复指南
问题表现
- 同一套WKWebView本地HTML加载逻辑,在iOS 12.4及以上的其他版本均可正常运行,仅在iOS 12.4.8专属版本下出现白屏、加载无响应的问题
- 控制台无WKWebView相关的常规加载报错日志,仅持续输出CoreUI框架的断言失败日志,核心报错为
-_CUIPDFRendition _initWithCSIHeader:方法校验提示“pixel format must be kCSIPixelFormatPDF” - 触发问题的核心业务代码如下:
private lazy var webView: WKWebView = { let web = WKWebView(frame: .zero, configuration: WKWebViewConfiguration()) return web }() override func viewDidLoad() { super.viewDidLoad() loadWebViewContent() } private func loadWebViewContent() { guard let filename = ZippedCalculatorsDefaults.filename else { return } var htmlURL = DocumentsDirectoryManager.shared.path .appendingPathComponent(filename) .appendingPathComponent("index") .appendingPathExtension("html") htmlURL = URL(string: "#\(item.alias)", relativeTo: htmlURL)! webView.loadFileURL(htmlURL, allowingReadAccessTo: htmlURL) }
问题根因
- 该问题是iOS 12.4.8版本的专属系统SDK缺陷:此版本下WKWebView的
loadFileURL:allowingReadAccessTo:接口,当传入带有URL hash锚点的本地文件路径时,会触发WebKit内核的异常分支,间接联动CoreUI框架的内置PDF渲染逻辑触发断言崩溃,最终中断HTML的加载流程 - 示例代码中直接基于HTML基础路径拼接
#xxx锚点作为加载入参的写法,正好命中该版本的bug触发条件
可落地修复方案
- 拆分加载流程,规避带锚点的URL直接作为
loadFileURL的入参:加载阶段传入无锚点的纯HTML文件基础路径,待页面加载完成后,再通过JS跳转到对应锚点位置 - 调整后的核心逻辑示例:
private func loadWebViewContent() { guard let filename = ZippedCalculatorsDefaults.filename else { return } // 生成无锚点的纯HTML文件路径作为加载入参 let baseHTMLURL = DocumentsDirectoryManager.shared.path .appendingPathComponent(filename) .appendingPathComponent("index") .appendingPathExtension("html") // 允许读取的路径设置为HTML所在的父目录,避免子资源加载权限异常 webView.loadFileURL(baseHTMLURL, allowingReadAccessTo: baseHTMLURL.deletingLastPathComponent()) // 绑定导航代理,监听页面加载完成事件 webView.navigationDelegate = self } // 实现WKNavigationDelegate的页面加载完成回调 extension UIViewController: WKNavigationDelegate { func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { // 页面加载完成后再执行锚点跳转,绕开iOS12.4.8的URL解析bug let anchorJumpScript = "window.location.hash = '#\(item.alias)'" webView.evaluateJavaScript(anchorJumpScript, completionHandler: nil) } }
- 额外兼容优化点:
- 初始化WKWebView时补充本地文件访问权限的配置,提升iOS12系列版本的加载兼容性,对应配置代码:
let config = WKWebViewConfiguration() config.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
- 注意 不要将带hash锚点的URL直接传入
allowingReadAccessTo参数,该参数需要传入真实存在的目录/文件路径,否则iOS12.x系列版本会直接触发文件权限校验失败。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

