在之前的iPhone中、我们可以根据导航栏上方的网络状态view、来判断网络状态。(这种方案本来就不太好)
并且,这种方案在iPhone X 手机上、不可使用。
那么,在iPhone X 或者之前的手机上面该怎么办呢?
我们可以通过 Reachability 来判断网络状态
Reachability github 地址:https://github.com/tonymillion/Reachability
使用方法超简单,Block方式和NSNotification方式 二选一即可。
1、添加SystemConfiguration.framework
.
2、使用Block方式
注意:当网络状态发生改变的时候、会在后台进程中触发Block、我们需要在主线程中进行UI更新操作。
Objective-C 代码如下:
// Allocate a reachability object
Reachability* reach = [Reachability reachabilityWithHostname:@"www.baidu.com"]; // Set the blocks
reach.reachableBlock = ^(Reachability*reach)
{
// keep in mind this is called on a background thread
// and if you are updating the UI it needs to happen
// on the main thread, like this: dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"REACHABLE!");
});
}; reach.unreachableBlock = ^(Reachability*reach)
{
NSLog(@"UNREACHABLE!");
}; // Start the notifier, which will cause the reachability object to retain itself!
[reach startNotifier];
Swift 代码如下:
import Reachability var reach: Reachability? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Allocate a reachability object
self.reach = Reachability.forInternetConnection() // Set the blocks
self.reach!.reachableBlock = {
(reach: Reachability?) -> Void in // keep in mind this is called on a background thread
// and if you are updating the UI it needs to happen
// on the main thread, like this:
DispatchQueue.main.async {
print("REACHABLE!")
}
} self.reach!.unreachableBlock = {
(reach: Reachability?) -> Void in
print("UNREACHABLE!")
} self.reach!.startNotifier() return true
}
3、NSNotification 方式
此方式界面发生了变化时、将会通知。通知将在主线程上传递,所以可以从函数中进行UI更新。此外,它要求监控对象考虑WWAN(3G / EDGE / CDMA)作为一个不可到达的连接(比如正在写一个视频流的应用程序,或者下载视频等等)。
Objective-C 代码如下:
// Allocate a reachability object
Reachability* reach = [Reachability reachabilityWithHostname:@"www.baidu.com"]; // Tell the reachability that we DON'T want to be reachable on 3G/EDGE/CDMA
reach.reachableOnWWAN = NO; // Here we set up a NSNotification observer. The Reachability that caused the notification
// is passed in the object parameter
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil]; [reach startNotifier];
Swift 代码如下:
import Reachability var reach: Reachability? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Allocate a reachability object
self.reach = Reachability.forInternetConnection() // Tell the reachability that we DON'T want to be reachable on 3G/EDGE/CDMA
self.reach!.reachableOnWWAN = false // Here we set up a NSNotification observer. The Reachability that caused the notification
// is passed in the object parameter
NotificationCenter.default.addObserver(
self,
selector: #selector(reachabilityChanged),
name: NSNotification.Name.reachabilityChanged,
object: nil
) self.reach!.startNotifier() return true
} func reachabilityChanged(notification: NSNotification) {
if self.reach!.isReachableViaWiFi() || self.reach!.isReachableViaWWAN() {
print("Service avalaible!!!")
} else {
print("No service avalaible!!!")
}
}