已接受的答案在iOS 10上无效。我找到了一种解决方法,并在AppDelegate中设置了一个计时器,每5秒钟检查一次currentRadioAccessTechnology属性。因此,我们还需要一个函数来检查是否有WIFI连接,而不是无线电访问技术。
检查WIFI连接是否可用:
class func isConnectedToWlan() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0,
sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
return false
}
let isReachable = flags == .reachable
let needsConnection = flags == .connectionRequired
return isReachable && !needsConnection
}
设置计时器的方法如下:
像这样设置:
Timer.scheduledTimer(timeInterval: TimeInterval.seconds(5.0), target: self, selector:
每5秒调用一次的选择器:
guard !Reachability.isConnecteToWlan() else {
return
}
guard let currentRadioAccessTechnology = info.currentRadioAccessTechnology else {
return
}
guard (currentRadioAccessTechnology == CTRadioAccessTechnologyGPRS
|| currentRadioAccessTechnology == CTRadioAccessTechnologyEdge) else {
return
}
if lastRadioAccessTechnology != nil {
guard let lastRadioAccessTechnology = lastRadioAccessTechnology,
(lastInfo != currentRadioAccessTechnology ||
lastInfo != currentRadioAccessTechnology) else {
return
}
}
lastRadioAccessTechnology = currentRadioAccessTechnology