在和服务端交互的时候我们通常会判断当前网络,再进行操作。
本文实现Alamofire或Reachability实现网络监听的两种常用方式。
具体封装类工具
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)
}
}
}