Xcode14.1中WKWebView调用evaluateJavaScript时崩溃报错
Xcode 14.1中WKWebView异步调用evaluateJavaScript崩溃问题
在Xcode 14.1环境下使用Swift开发时,调用WKWebView的evaluateJavaScript异步方法会触发崩溃,该问题已在iOS端验证,macOS端大概率存在相同问题。
崩溃复现代码
let webView = WKWebView() Task { try? await webView.evaluateJavaScript("console.log('hello world')") }
报错信息
:0: 致命错误:隐式解包可选值时意外发现nil
问题原因
崩溃的核心原因是:创建的WKWebView实例既没有被强引用持有,也没有被添加到视图层级中。当异步任务开始执行时,WebView实例可能已经被系统释放,导致其内部隐式解包的可选值变为nil,进而触发致命错误。
修复方案
要解决这个问题,需要满足两个条件之一(或同时满足):
- 确保WKWebView实例被强引用持有(比如作为类的属性)
- 将WKWebView添加到视图层级中
修复后的示例代码:
class ViewController: UIViewController { // 用类属性强引用WKWebView实例 private let webView = WKWebView() override func viewDidLoad() { super.viewDidLoad() // 将WebView添加到视图层级,确保其生命周期稳定 webView.frame = view.bounds view.addSubview(webView) // 在WebView初始化完成后执行JS代码 Task { try? await webView.evaluateJavaScript("console.log('hello world')") } } }
如果不需要显示WebView,至少要保证实例被强引用持有,并且建议等待WebView完成页面加载(通过WKNavigationDelegate的webView(_:didFinish:)代理方法确认)后再执行JavaScript代码,避免因初始化未完成导致的异常。
内容的提问来源于stack exchange,提问作者Vicente Garcia
相关产品推荐
相关产品推荐

