使用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终止时停止通知器并移除观察者,这是良好的内存管理习惯,避免潜在的内存泄漏。
真机测试注意事项:
- 确认你的App在iPhone 7的设置里已经开启了蜂窝网络/Wi-Fi权限,没有权限的话网络状态检测会失效。
- 开关Wi-Fi后可能会有1-2秒的延迟,状态变化的通知才会触发,不要刚操作就判定没效果。
内容的提问来源于stack exchange,提问作者calvin sugianto
相关产品推荐
相关产品推荐

