检测 Internet 连接 xcode swift 任何更改的最佳方法 [英] The best way to detect any change to Internet Connection xcode swift
问题描述
我想知道是否有最好的方法来检测 Internet 连接发生的任何变化
我的意思是使用此代码
import SystemConfigurationvar isConnected: Bool = falsefunc isConnectedToNetwork(){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(sizeofValue(zeroAddress))zeroAddress.sin_family = sa_family_t(AF_INET)让 defaultRouteReachability = withUnsafePointer(&zeroAddress) {SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()}var 标志:SCNetworkReachabilityFlags = 0如果 SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {self.isConnected = false}让 isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0让需要连接 = (标志 & UInt32(kSCNetworkFlagsConnectionRequired)) != 0if isReachable &&!needsConnection{self.isConnected = 真}别的{self.isConnected = false}}
它返回 Internet 连接的状态,但即使我需要在应用程序运行时不断检查 Internet 连接,所以我使用了此代码
NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("isConnectedToNetwork"), userInfo: nil, repeats: true)
它每 10 秒检查一次互联网连接,但我相信有更好的方法.我的意思是使用观察者或其他东西.
比如这个
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardDidShow", name: UIKeyboardDidShowNotification, object: nil)
当键盘显示它检测到它并调用函数keyboardDidShow()
Swift 3.0+
这是我设法达到的最干净的解决方案.
您需要安装此 pod https://github.com/AFNetworking/AFNetworking>
然后在您声明 NetworkReachability
类的地方 import AFNetworking
.
final class NetworkReachability {私有变量previousStatus:AFNetworkReachabilityStatus = .unknown///检索当前网络状态一次并停止监视可达性.func getCurrentNetworkStatus(完成:((AFNetworkReachabilityStatus)-> Void)?){以前的状态 = .unknownstartMonitoring { currentStatus in完成?(当前状态)self.stopMonitoring()}}///监控网络可达性变化,直到出现可达状态.然后停止监控.func getReachableNetworkStatus(完成:((AFNetworkReachabilityStatus)-> Void)?){停止监控()startMonitoring { currentStatus in完成?(当前状态)if currentStatus == .reachableViaWiFi ||currentStatus == .reachableViaWWAN {self.stopMonitoring()}}}///监控网络可达性变化,直到调用 stopMonitoring().func startMonitoring(newStatusCallback: ((AFNetworkReachabilityStatus) -> Void)?) {AFNetworkReachabilityManager.shared().startMonitoring()AFNetworkReachabilityManager.shared().setReachabilityStatusChange { currentStatus in如果 currentStatus != .unknown &¤tStatus != self.previousStatus {newStatusCallback?(currentStatus)}self.previousStatus = currentStatus}}功能停止监控(){以前的状态 = .unknownAFNetworkReachabilityManager.shared().stopMonitoring()}}
I was wondering if there is a best way to detect any change happens to Internet Connection
i mean using this code
import SystemConfiguration
var isConnected: Bool = false
func isConnectedToNetwork()
{
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(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
}
var flags: SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
self.isConnected = false
}
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
if isReachable && !needsConnection
{
self.isConnected = true
}
else{
self.isConnected = false
}
}
it returns the status for Internet Connection, but even though i need to keep checking for Internet connection while the app is running so i used this code
NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("isConnectedToNetwork"), userInfo: nil, repeats: true)
Each 10 seconds it checks for internet connection, but i believe there is a better way. i mean using an observer or something else.
such as this one
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardDidShow", name: UIKeyboardDidShowNotification, object: nil)
when the keyboard shows it detects it and calls the function keyboardDidShow()
Swift 3.0+
This is the most clean solution I managed to reach.
You need to install this pod https://github.com/AFNetworking/AFNetworking
Then import AFNetworking
where you declare NetworkReachability
class.
final class NetworkReachability {
private var previousStatus: AFNetworkReachabilityStatus = .unknown
/// Retrieves current network status once and stops monitoring reachability.
func getCurrentNetworkStatus(completion: ((AFNetworkReachabilityStatus) -> Void)?) {
previousStatus = .unknown
startMonitoring { currentStatus in
completion?(currentStatus)
self.stopMonitoring()
}
}
/// Monitors network reachability changes until reachable status is present. Then stops monitoring.
func getReachableNetworkStatus(completion: ((AFNetworkReachabilityStatus) -> Void)?) {
stopMonitoring()
startMonitoring { currentStatus in
completion?(currentStatus)
if currentStatus == .reachableViaWiFi || currentStatus == .reachableViaWWAN {
self.stopMonitoring()
}
}
}
/// Monitors network reachability changes, until stopMonitoring() is called.
func startMonitoring(newStatusCallback: ((AFNetworkReachabilityStatus) -> Void)?) {
AFNetworkReachabilityManager.shared().startMonitoring()
AFNetworkReachabilityManager.shared().setReachabilityStatusChange { currentStatus in
if currentStatus != .unknown && currentStatus != self.previousStatus {
newStatusCallback?(currentStatus)
}
self.previousStatus = currentStatus
}
}
func stopMonitoring() {
previousStatus = .unknown
AFNetworkReachabilityManager.shared().stopMonitoring()
}
}
这篇关于检测 Internet 连接 xcode swift 任何更改的最佳方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!