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

使用Alamofire检测iOS设备网络连接的技术问询

我来帮你完善这段Alamofire网络可达性检测的代码,同时补上几个容易踩坑的关键细节,让它在实际项目里更健壮可靠:

完善后的完整实现
import Alamofire

class ReachabilityManager {
    // 单例模式,全局仅一个监听实例,避免资源浪费和状态冲突
    static let shared = ReachabilityManager()
    
    private let networkReachabilityManager: NetworkReachabilityManager?
    
    // 定义状态回调的闭包类型,方便外部注册监听
    typealias NetworkStatusCallback = (NetworkReachabilityManager.NetworkReachabilityStatus) -> Void
    private var statusCallbacks: [NetworkStatusCallback] = []
    
    private init() {
        // 建议替换成你的后端服务域名,比检测Google更贴合业务实际
        networkReachabilityManager = NetworkReachabilityManager(host: "www.your-service-domain.com")
        startListening()
    }
    
    private func startListening() {
        networkReachabilityManager?.listener = { [weak self] status in
            print("当前网络状态: \(status)")
            
            // 通知所有注册的外部回调
            self?.statusCallbacks.forEach { $0(status) }
            
            switch status {
            case .notReachable:
                print("⚠️ 无网络连接")
                // 这里可以添加UI提示逻辑,比如弹出Toast、更新状态栏
            case .reachable(let connectionType):
                print("✅ 网络可用,连接类型: \(connectionType)")
                // 网络恢复后的业务逻辑,比如自动重试请求、刷新页面数据
            case .unknown:
                print("❓ 网络状态未知")
                // 未知状态建议做兼容处理,比如默认保留当前状态或提示用户检查网络
            }
        }
        // 原代码漏掉了这关键一步!必须启动监听才会触发状态回调
        networkReachabilityManager?.startListening()
    }
    
    // 提供外部注册状态监听的方法
    func addStatusCallback(_ callback: @escaping NetworkStatusCallback) {
        statusCallbacks.append(callback)
        // 注册时立即返回当前网络状态,避免等待状态变化
        if let currentStatus = networkReachabilityManager?.status {
            callback(currentStatus)
        }
    }
    
    // 移除所有回调,避免内存泄漏(比如页面销毁时调用)
    func removeAllCallbacks() {
        statusCallbacks.removeAll()
    }
    
    // 便捷获取当前网络状态
    var currentStatus: NetworkReachabilityManager.NetworkReachabilityStatus? {
        return networkReachabilityManager?.status
    }
}
关键改进说明
  • 单例模式:用static let shared保证全局只有一个监听实例,避免重复创建导致的资源浪费和状态不一致
  • 启动监听:原代码缺失startListening()调用,这是让监听逻辑生效的核心步骤,没有这一步完全不会触发状态回调
  • 内存安全:在listener闭包中使用[weak self]避免循环引用,防止内存泄漏
  • 多场景监听支持:通过statusCallbacks数组支持外部多处注册状态回调,比如多个ViewController都能收到网络变化通知
  • 细分状态处理:把.unknown状态单独处理,原代码将其和.reachable归为一类容易导致误判
  • 业务贴合性:建议替换检测Host为你的后端域名,比检测Google更能反映用户是否能正常访问你的服务
使用示例(在ViewController中)
override func viewDidLoad() {
    super.viewDidLoad()
    
    // 注册网络状态监听
    ReachabilityManager.shared.addStatusCallback { [weak self] status in
        guard let self = self else { return }
        switch status {
        case .notReachable:
            self.showNoNetworkTip()
        case .reachable:
            self.reloadPageData()
        case .unknown:
            self.showNetworkUnknownState()
        }
    }
}

// 页面销毁时移除回调,避免内存泄漏
deinit {
    ReachabilityManager.shared.removeAllCallbacks()
}

内容的提问来源于stack exchange,提问作者Evgeniy Kleban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:16:26