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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:48:52