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
相关产品推荐
相关产品推荐

