iOS WKWebView中JS如何接收online/offline网络事件
WKWebView 中 online/offline 事件不触发的原因
iOS端WKWebView默认没有实现系统网络状态监听逻辑,不会在网络切换时自动向JS环境派发online/offline事件,这是WebKit在iOS平台的固有实现特性,和加载本地/远程HTML无关,也不存在可直接开启该功能的配置项。Android端WebView默认内置了该监听逻辑,所以相同JS代码可以正常运行。
修复方案
你不需要修改现有JS侧的事件监听代码,只需要在原生端补全网络状态监听、手动向WebView派发对应事件即可:
- 原生端推荐使用苹果官方提供的
NWPathMonitor(iOS 12及以上版本支持)监听网络状态变化,在状态回调中主动执行JS代码派发标准事件,示例Swift实现:
import Network import WebKit // 需强引用monitor实例,避免被提前释放导致监听失效 private var networkMonitor: NWPathMonitor? func bindNetworkEvent(for webView: WKWebView) { let monitor = NWPathMonitor() monitor.pathUpdateHandler = { [weak webView] path in let isConnected = path.status == .satisfied let eventName = isConnected ? "online" : "offline" DispatchQueue.main.async { // 手动向JS上下文派发标准事件 let triggerJS = "window.dispatchEvent(new Event('\(eventName)'));" webView?.evaluateJavaScript(triggerJS) // 可选:同步修正navigator.onLine的返回值,避免部分iOS版本下该属性值不准 let updatePropJS = "Object.defineProperty(navigator, 'onLine', {value: \(isConnected), writable: false});" webView?.evaluateJavaScript(updatePropJS) } } monitor.start(queue: DispatchQueue(label: "com.example.networkqueue")) self.networkMonitor = monitor }
- 如果需要兼容iOS 12以下版本,将
NWPathMonitor替换为SystemConfiguration框架下的SCNetworkReachability实现即可,核心逻辑不变:监听到网络状态变化后,主线程调用evaluateJavaScript派发对应事件。 - 现有JS侧注册的事件监听器可以直接捕获手动派发的标准事件,无需做任何适配修改。
注意事项
- 不要直接信任WKWebView默认的
navigator.onLine返回值,部分iOS版本下该值不会随网络状态实时更新,建议在监听回调中同步更新该属性值,保证JS侧读值准确。 - 监听网络状态的队列不要使用主队列,避免阻塞UI,执行JS派发事件时必须切换回主线程。
内容的提问来源于stack exchange,提问作者Martin Tale
相关产品推荐
相关产品推荐

