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

iOS 15下释放WKNavigationAction子类实例触发WebKit内部崩溃问题求解

问题原因

这是iOS 15.0到15.4版本的WebKit已知bug:WKNavigationAction的dealloc方法内部有主队列调度逻辑,外部自定义的子类实例释放时,会访问无效的内部上下文导致崩溃。苹果已经在iOS 15.5及以上系统修复了该问题,高版本运行不会触发崩溃。

可选用的解决方案

  • 方案一:提升最低兼容版本到iOS 15.5+
    如果业务允许将App最低支持系统版本调整为iOS 15.5或更高,无需修改任何代码,问题直接消失。
  • 方案二:用组合模式替代子类化
    不直接继承WKNavigationAction,新建独立的Mock类,将需要用到的原生WKNavigationAction实例作为内部属性持有,所有原生属性、方法调用都转发给内部实例,自定义Mock属性直接在当前类实现,从根源上避免继承带来的释放问题,示例实现如下:
import WebKit

class MockNavigationAction: NSObject {
    // 可选持有原生实例,需要原生能力时做转发
    private let originAction: WKNavigationAction?
    
    // 转发原生属性
    var request: URLRequest {
        originAction?.request ?? URLRequest(url: URL(string: "about:blank")!)
    }
    var navigationType: WKNavigationType {
        originAction?.navigationType ?? .other
    }
    
    // 自定义的Mock属性
    var mockIsUserInitiated: Bool = false
    
    init(originAction: WKNavigationAction? = nil) {
        self.originAction = originAction
    }
}
  • 方案三:纯接口模拟(仅单元测试场景适用)
    如果是单元测试场景,完全不需要用到WKNavigationAction的原生逻辑,直接让Mock类继承NSObject,实现所有测试用例需要用到的同名属性和方法即可,不需要继承WKNavigationAction,也不需要持有原生实例,不会触发系统层面的崩溃。

内容的提问来源于stack exchange,提问作者mbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:27:05