Swift笔记36:网络监听

在和服务端交互的时候我们通常会判断当前网络,再进行操作。
本文实现Alamofire或Reachability实现网络监听的两种常用方式。

查看demo

具体封装类工具
enum NetworkStatus {
    /// 未知网络
    case unknown
    /// 无网络
    case notReachable
    /// 手机网络
    case wwan
    /// WIFI网络
    case ethernetOrWiFi
}

class AlamofireMonitorNetworkTool {
    static let shared = AlamofireMonitorNetworkTool()
    
    static let networkManager = NetworkReachabilityManager(host: "www.baidu.com")
    /// 实时监听网络变化 - Alamofire
    static func monitorNetworkStatusWithAlamofire(status: @escaping (NetworkStatus)->Void) {
        networkManager!.listener = {
            alamofireStatus in
            var message = ""
            switch alamofireStatus {
            case .unknown:
                message = "未知网络"
                status(.unknown)
            case .notReachable:
                message = "无网络连接"
                status(.notReachable)
            case .reachable(.wwan):
                message = "蜂窝移动网络"
                status(.wwan)
            case .reachable(.ethernetOrWiFi):
                message = "WiFi"
                status(.ethernetOrWiFi)
            }
            mLog("当前网络状态:\(message)")
        }
        networkManager!.startListening()
    }
    // 判断网络是否连接
    static func isNetwork() -> Bool {
        return networkManager?.isReachable ?? true // 无返回就默认网络已连接
    }


}
class ReachabilityMonitorNetworkTool {
    static let shared = ReachabilityMonitorNetworkTool()
    static let reachability = try! Reachability()
    /// 实时监听网络变化 - Reachability
    static func monitorNetworkStatusWithReachability(status: @escaping (NetworkStatus)->Void) {
        // 网络可用或切换网络类型时执行
        reachability.whenReachable = { reachability in
            if reachability.connection == .wifi {
                // print("WiFi")
                status(.ethernetOrWiFi)
            } else {
                // print("蜂窝移动网络")
                status(.wwan)
            }
        }

        // 网络不可用时执行
        reachability.whenUnreachable = { _ in
            // print("无网络连接")
            status(.notReachable)
        }

        do {
            // 开始监听,停止监听调用reachability.stopNotifier()即可
            try reachability.startNotifier()
        } catch {
            print("Unable to start notifier")
        }
    }
}
具体使用
extension AppDelegate {
    // MARK: - 实时网络监测
    func monitorNetwork() {
        /// 监听网络变化 - Alamofire
        self.monitorNetworkAlamofire()
        mLog(AlamofireMonitorNetworkTool.isNetwork())
        /// 监听网络变化 - ReachabilitySwift
        /// monitorNetworkReachability()
    }

    /// 监听网络变化 - Alamofire
    func monitorNetworkAlamofire() {
        AlamofireMonitorNetworkTool.monitorNetworkStatusWithAlamofire { status in
            var message = ""
            switch status {
            case .unknown:
                message = "未知网络"
            case .notReachable:
                message = "无网络连接"
            case .wwan:
                message = "蜂窝移动网络"
            case .ethernetOrWiFi:
                message = "WiFi"
            }
            Toast.toast("Alamofire网络监控:\(message)", duration: 0.99)
        }
    }

    /// 监听网络变化 - Reachability
    func monitorNetworkReachability() {
        ReachabilityMonitorNetworkTool.monitorNetworkStatusWithReachability { status in
            var message = ""
            switch status {
            case .unknown:
                message = "未知网络"
            case .notReachable:
                message = "无网络连接"
            case .wwan:
                message = "蜂窝移动网络"
            case .ethernetOrWiFi:
                message = "WiFi"
            }
            Toast.toast("Reachability网络监控:\(message)", duration: 0.99)
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容