iOS 26 Beta 4自定义Scheme的WKURLSchemeHandler加载含脚本网页致Web进程崩溃问题(已在Beta 5修复)
iOS 26 Beta 4自定义Scheme的WKURLSchemeHandler加载含脚本网页致Web进程崩溃问题(已在Beta 5修复)
大家好,我在iOS 26 Beta 4的测试中碰到了一个WebKit进程崩溃的问题,和自定义URL Scheme Handler的使用场景相关,下面把详细情况分享给大家:
Update (06.08.2025): 好消息!这个问题已经在iOS Beta 5版本中被官方修复了。
问题现象
在iOS 26 Beta 4中测试发现,当使用自定义URL Scheme,且加载的HTML页面包含引用外部脚本文件的<script>元素时,Web进程会直接终止,Xcode控制台会输出类似这样的崩溃日志:
0x1130bc170 - [PID=47858] WebProcessProxy::didClose: (web process 0 crash) 0x1130bc170 - [PID=47858] WebProcessProxy::processDidTerminateOrFailedToLaunch: reason=Crash
重现步骤
- 创建带自定义配置的WKWebView,为自定义Scheme注册对应的WKURLSchemeHandler实现类
- 加载包含
<script>标签的HTML页面,其中script引用了另一个通过自定义Scheme提供的JS文件
- 加载包含
- 运行后即可观察到Web进程终止的现象
预期与实际结果
- 预期结果:WKWebView正常加载并渲染页面内容,脚本正常执行
- 实际结果:Web进程直接崩溃终止,会触发
WKNavigationDelegate的webViewWebContentProcessDidTerminate回调
补充测试情况
测试中发现以下几种场景不会触发崩溃:
- HTML中引用的是CSS文件而非JS文件
- 移除HTML中的
<script>标签 - 给
<script>标签添加async属性
完整代码示例
import UIKit import WebKit final class CustomSchemeViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let sampleConfiguration = WKWebViewConfiguration() sampleConfiguration.setURLSchemeHandler( SampleURLSchemeHandler(), forURLScheme: "sample" ) let webView = WKWebView(frame: view.bounds, configuration: sampleConfiguration) webView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(webView) webView.navigationDelegate = self webView.load(URLRequest(url: URL(string: "sample://pages/sample.html")!)) } } extension CustomSchemeViewController: WKNavigationDelegate { func webViewWebContentProcessDidTerminate(_ webView: WKWebView) { print("webViewWebContentProcessDidTerminate") } } final class SampleURLSchemeHandler: NSObject, WKURLSchemeHandler { private func post(_ body: String, mimeType: String, urlSchemeTask: WKURLSchemeTask) { let bodyData = Data(body.utf8) let response = URLResponse( url: urlSchemeTask.request.url!, mimeType: mimeType, expectedContentLength: bodyData.count, textEncodingName: nil ) urlSchemeTask.didReceive(response) urlSchemeTask.didReceive(bodyData) urlSchemeTask.didFinish() } func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) { guard let lastPathComponent = urlSchemeTask.request.url?.lastPathComponent else { assertionFailure() return } switch lastPathComponent { case "sample.html": let htmlContent = """ <?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script src="/scripts/sample.js"></script> </head> <body> <p>Sample</p> </body> </html> """ post(htmlContent, mimeType: "application/xhtml+xml", urlSchemeTask: urlSchemeTask) case "sample.js": let jsContent = "console.log('Hello from JS File')" post(jsContent, mimeType: "text/javascript", urlSchemeTask: urlSchemeTask) default: assertionFailure() } } func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) { print("webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask)") } }
内容来源于stack exchange
相关产品推荐
相关产品推荐

