iOS26上WKWebview闪退问题修复

起因

项目中有个轮播器,可以左右滑动,测试反馈在切换三四十次只有会出现闪退,可以稳定复现。

在低版本系统上iOS15.7.6上无法复现,只有最新的iOS26系统上才会出现闪退的情况。

观察发现轮播器切换过程中,内存占用没有明显变化,崩溃日志也看不出明显异常。

真机奔溃日志分析结论:崩溃类型为 EXC_CRASH (SIGABRT),由 QuartzCore 框架的图层(CALayer)提交逻辑递归过深导致,触发内存分配失败后调用 abort() 终止应用,核心问题集中在图层管理混乱、内存泄漏导致图层树异常,进而触发 CA::Layer::commit_if_needed 递归过深。

一时半会也没明白是怎么回事。

interruptionHandler is called. -[FontServicesDaemonManager connection]_block_invoke
Handled error from server: Connection interrupted
0x124070100 - [PID=27006] WebProcessProxy::didClose: (web process 0 crash)
0x124070100 - [PID=27006] WebProcessProxy::processDidTerminateOrFailedToLaunch: reason=Crash
0x109b41518 - [pageProxyID=5, webPageID=6, PID=27006] WebPageProxy::processDidTerminate: (pid 27006), reason=Crash
0x109b41518 - [pageProxyID=5, webPageID=6, PID=27006] WebPageProxy::dispatchProcessDidTerminate: reason=Crash
0x109b41518 - [pageProxyID=5, webPageID=6, PID=27006] WebPageProxy::dispatchProcessDidTerminate: Not eagerly reloading the view because it is not currently visible
Error acquiring assertion: <Error Domain=RBSServiceErrorDomain Code=1 "((target is not running or doesn't have entitlement com.apple.developer.web-browser-engine.rendering AND target is not running or doesn't have entitlement com.apple.developer.web-browser-engine.networking AND target is not running or doesn't have entitlement com.apple.developer.web-browser-engine.webcontent))" UserInfo={NSLocalizedFailureReason=((target is not running or doesn't have entitlement com.apple.developer.web-browser-engine.rendering AND target is not running or doesn't have entitlement com.apple.developer.web-browser-engine.networking AND target is not running or doesn't have entitlement com.apple.developer.web-browser-engine.webcontent))}>
0x1244ac540 - ProcessAssertion::acquireSync Failed to acquire RBS assertion 'XPCConnectionTerminationWatchdog' for process with PID=27006, error: (null)

通过排查代码可以确认,问题和WKWebview有关,崩溃类型为 WebProcess(WKWebView 渲染进程)崩溃,根源是页中 WKWebView 生命周期管理混乱(频繁创建 / 未彻底释放),导致 WebProcess 资源耗尽、进程通信中断,最终触发崩溃。日志中 FontServicesDaemonManager 连接中断、RBS 断言失败均为 WebProcess 崩溃后的连锁反应。

修复方法

彻底销毁 WebView,释放 WebProcess 资源

// 关键修复:销毁 WKWebView 核心资源
webVC.webView.navigationDelegate = nil; // 清空代理,避免循环引用
webVC.webView.uiDelegate = nil;
webVC.webView = nil; // 释放 WebView,触发 WebProcess 回收

一句话真因

iOS 26.0 及以上版本,WKWebView 必须手动设置 navigationDelegate = nil 和 uiDelegate = nil 才能彻底释放,否则会因代理强引用形成循环,导致 WebView 无法销毁、WebProcess 残留,最终触发崩溃。


Written on October 15, 2025