使用Reachability判断网络使用情况
特别说明:启动监测需要在`AppDelegate`的`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions`方法中实现。
.h文件
#import <Foundation/Foundation.h>
#import "Reachability.h"
@interface NetworkManager : NSObject
///单例模式
+ (NetworkManager *)shareNetworkManager;
///开启网络状态监听
- (BOOL)startNetworkStatusNotifier;
///获得当前的网络状态
+ (BOOL)getNetworkStatus;
@end
.m文件
#import "NetworkManager.h"
static NetworkManager *staticNetworkStatusManager; //单例实例
static NetworkStatus staticCurrentNetworkStatus; //当前网络连接
@implementation NetworkManager
{
Reachability *hostReachbility;
}
//单例模式
+ (NetworkManager *)shareNetworkManager
{
if (nil == staticNetworkStatusManager)
{
staticNetworkStatusManager = [[NetworkManager alloc] init];
}
return staticNetworkStatusManager;
}
//开启网络状态监听
- (BOOL)startNetworkStatusNotifier
{
// 检测设备网络状态,可以以多种形式初始化
hostReachbility = [Reachability reachabilityWithHostName:@"www.baidu.com"];
// 获得设备现在的网络状态
staticCurrentNetworkStatus = [hostReachbility currentReachabilityStatus];
// 开启网络状况的监听
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
//开始监听,会启动一个run loop
return [hostReachbility startNotifier];
}
//处理连接改变后的情况
- (void)updateInterfaceWithReachability:(Reachability *)curReach
{
staticCurrentNetworkStatus = [curReach currentReachabilityStatus];
}
//连接改变
- (void)reachabilityChanged:(NSNotification *)note
{
Reachability *curReach = [note object];
// NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
if ([curReach isKindOfClass:[Reachability class]])
{
[self updateInterfaceWithReachability: curReach];
}
}
//获得当前的网络状态
+ (BOOL)getNetworkStatus
{
return staticCurrentNetworkStatus;
}
@end
使用
1 导入头文件
#import "NetworkManager.h"
2 初始化
在AppDelegate的方法“
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions”中设置
//获得设备的网络状态
[[NetworkManager shareNetworkManager] startNetworkStatusNotifier];
3 使用
if ([NetworkManager getNetworkStatus] == NotReachable)
{
}
补充完善
2019-03-27
1、网络状态说明
使用`AFNetworking`中的`AFNetworkReachabilityManager`类。
(1)没有网络`AFNetworkReachabilityStatusNotReachable`
(2)wifi网络`AFNetworkReachabilityStatusReachableViaWiFi`
(3)蜂窝移动网络`AFNetworkReachabilityStatusReachableViaWWAN`
2、网络权限说明
使用系统原生`CTCellularData`类。
(1)关闭,网络状态为`AFNetworkReachabilityStatusNotReachable`
(2)WLAN,若`无线局域网`关闭,或`蜂窝移动网络`开启时,则网络状态为`AFNetworkReachabilityStatusNotReachable`;若`WLAN`开启时,则网络状态为`AFNetworkReachabilityStatusReachableViaWiFi`;
(3)WLAN与蜂窝移动网,若关闭、或`WLAN`关闭时、或`蜂窝移动网络`关闭时,则网络状态为`AFNetworkReachabilityStatusNotReachable`;若`WLAN`开启时,则网络状态为`AFNetworkReachabilityStatusReachableViaWiFi`;若`蜂窝移动网络`开启且`WLAN`关闭时,则网络状态为`AFNetworkReachabilityStatusReachableViaWWAN`
代码示例
// 导入头文件
#import <AFNetworking/AFNetworking.h>
// 开启监测
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
// 获取状态
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status == AFNetworkReachabilityStatusUnknown) {
NSLog(@"未知, AFNetworkReachabilityStatusUnknown");
} else if (status == AFNetworkReachabilityStatusNotReachable) {
NSLog(@"无网, AFNetworkReachabilityStatusNotReachable");
} else if (status == AFNetworkReachabilityStatusReachableViaWWAN) {
NSLog(@"蜂窝移动网络, AFNetworkReachabilityStatusReachableViaWWAN");
} else if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
NSLog(@"wifi, AFNetworkReachabilityStatusReachableViaWiFi");
}
}];
// 导入头文件
#import <CoreTelephony/CTCellularData.h>
// 移动蜂窝网络
CTCellularData *cellularData = [[CTCellularData alloc] init];
// 监测权限变化
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState restrictedState) {
switch (restrictedState) {
case kCTCellularDataRestrictedStateUnknown:
// 关闭
NSLog(@"蜂窝移动网络状态:未知");
break;
case kCTCellularDataRestricted:
// WLAN
NSLog(@"蜂窝移动网络状态:关闭");
break;
case kCTCellularDataNotRestricted:
// WLAN与蜂窝移动网
NSLog(@"蜂窝移动网络状态:开启");
break;
default:
NSLog(@"蜂窝移动网络状态:未知");
break;
}
};