3分钟上手网络检测:Reachability.swift可复制代码最佳实践
你是否还在为iOS网络状态检测写冗长代码?是否遇到过WiFi/蜂窝网络切换时App崩溃?本文通过5个可直接复制的代码片段,带你掌握Reachability.swift的核心用法,解决90%的网络状态监听场景。读完本文你将学会:快速初始化检测实例、实时监听网络变化、区分WiFi/蜂窝网络、处理网络异常场景,以及在UI中动态展示连接状态。
项目简介与核心文件
Reachability.swift是Apple官方Reachability类的Swift重写版本,通过闭包回调简化网络状态检测。项目核心代码位于Sources/Reachability.swift,定义了网络连接类型枚举、状态监听协议和通知机制。示例工程包含iOS、macOS和Apple TV平台的实现,可参考ReachabilitySample/目录下的ViewController实现。
1. 基础初始化:3行代码检测网络
创建Reachability实例是所有操作的基础,推荐使用默认初始化方法检测设备整体网络状态:
import Reachability
do {
let reachability = try Reachability()
// 开始网络监听
} catch {
print("初始化失败: \(error)")
}
若需检测特定域名的可达性(如API服务器),可使用主机名初始化:
let reachability = try Reachability(hostname: "api.example.com")
2. 实时监听:闭包回调处理网络变化
通过闭包注册网络状态变化事件,无需手动处理通知中心:
reachability.whenReachable = { reachability in
if reachability.connection == .wifi {
print("WiFi连接已恢复")
} else if reachability.connection == .cellular {
print("蜂窝网络已连接")
}
}
reachability.whenUnreachable = { _ in
print("网络连接已断开")
}
// 启动监听器
try reachability.startNotifier()
3. 网络类型区分:业务逻辑适配
根据网络类型执行不同策略,如蜂窝网络下降低图片质量:
func setupNetworkDependentFeatures() {
switch reachability.connection {
case .wifi:
loadHighQualityImages()
startBackgroundSync()
case .cellular:
loadCompressedImages()
disableAutoSync()
case .unavailable:
showOfflineMode()
}
}
4. 生命周期管理:避免内存泄漏
在UIViewController中正确管理Reachability生命周期:
class NetworkAwareViewController: UIViewController {
var reachability: Reachability!
override func viewDidLoad() {
super.viewDidLoad()
setupReachability()
}
private func setupReachability() {
do {
reachability = try Reachability()
try reachability.startNotifier()
} catch {
print("Reachability配置失败: \(error)")
}
}
deinit {
reachability.stopNotifier()
}
}
5. 通知机制:跨组件状态同步
使用系统通知中心实现全局网络状态同步:
// 注册通知
NotificationCenter.default.addObserver(self,
selector: #selector(networkStatusChanged(_:)),
name: .reachabilityChanged,
object: nil)
// 处理通知
@objc func networkStatusChanged(_ notification: Notification) {
guard let reachability = notification.object as? Reachability else { return }
print("网络状态更新: \(reachability.connection)")
}
常见问题与解决方案
| 问题场景 | 解决代码 |
|---|---|
| 监听器启动失败 | try? reachability.startNotifier() 改为 try reachability.startNotifier() 并处理错误 |
| 频繁状态切换 | 在回调中添加防抖处理 DispatchQueue.main.asyncAfter(deadline: .now() + 1) |
| 模拟器测试 | 模拟器始终返回WiFi连接,需真机测试蜂窝网络逻辑 |
示例工程结构参考
项目提供多平台示例实现,文件结构如下:
- ReachabilitySample/ViewController.swift: iOS平台示例
- ReachabilityMacSample/: macOS桌面应用示例
- ReachabilityAppleTVSample/: tvOS平台实现
建议通过研究这些示例了解不同平台的集成细节,特别注意UI更新需在主线程执行。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



