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

使用ReachabilitySwift 5.0时,NotificationCenter监听网络状态变化失效

解决ReachabilitySwift 5.0 NotificationCenter监听网络状态无回调的问题

我帮你排查了下代码里的问题,导致reachabilityChanged方法没触发的核心原因很明确——你创建的reachability是局部变量!在didFinishLaunchingWithOptions方法执行完毕后,这个局部变量会被ARC自动回收,通知中心监听的对象都不存在了,自然不会再发送状态变化的通知。

下面是修正后的完整代码,我还顺便适配了Reachability 5.0的最新API规范:

class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    // 把Reachability声明为AppDelegate的实例变量,保持引用不被回收
    private var reachability: Reachability?
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        do {
            // 初始化实例并赋值给实例变量
            reachability = try Reachability()
            // 绑定监听,注意object参数用我们持有的实例变量
            NotificationCenter.default.addObserver(
                self,
                selector: #selector(reachabilityChanged(note:)),
                name: .reachabilityChanged,
                object: reachability
            )
            try reachability?.startNotifier()
            print("start notifierrrr")
        } catch {
            print("could not start reachability notifier: \(error.localizedDescription)")
        }
        // 其他启动逻辑
        return true
    }
    
    @objc func reachabilityChanged(note: Notification) {
        guard let reachability = note.object as? Reachability else {
            print("无法获取Reachability实例")
            return
        }
        // 注意Reachability 5.0已经弃用currentReachabilityStatus,改用connection属性
        switch reachability.connection {
        case .wifi:
            print("Reachable via WiFi bbb")
        case .cellular:
            print("Reachable via WWAN bbb")
        case .unavailable, .none:
            print("Network not reachable bbb")
        }
    }
    
    // 记得在App终止时清理资源,避免内存泄漏
    func applicationWillTerminate(_ application: UIApplication) {
        reachability?.stopNotifier()
        NotificationCenter.default.removeObserver(
            self,
            name: .reachabilityChanged,
            object: reachability
        )
    }
}

几个关键的修正点:

  • 持有Reachability实例:将reachability从局部变量改为AppDelegate的实例变量,确保它在App生命周期内不会被回收,通知中心才能持续监听状态变化。
  • 适配新版API:Reachability 5.0中currentReachabilityStatus已经被标记为废弃,建议使用connection属性,对应的枚举值也做了更新,这样代码更稳定。
  • 资源清理:在App终止时停止通知器并移除观察者,这是良好的内存管理习惯,避免潜在的内存泄漏。

真机测试注意事项:

  1. 确认你的App在iPhone 7的设置里已经开启了蜂窝网络/Wi-Fi权限,没有权限的话网络状态检测会失效。
  2. 开关Wi-Fi后可能会有1-2秒的延迟,状态变化的通知才会触发,不要刚操作就判定没效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:02:26