You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

重现步骤

    1. 创建带自定义配置的WKWebView,为自定义Scheme注册对应的WKURLSchemeHandler实现类
    1. 加载包含<script>标签的HTML页面,其中script引用了另一个通过自定义Scheme提供的JS文件
    1. 运行后即可观察到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:05:27