1.iOS 10下app网络权限问题
ios10系统开始,首次下载并安装应用程序会提示"是否允许使用网络"......ios9开始有一个系统的block可以实时的监测到程序网络权限的状态
首先在AppDelegate中:
@import CoreTelephony;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 应用启动后,检测应用中是否有联网权限
CTCellularData *cellularData = [[CTCellularData alloc]init];
cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state){
switch (state) {
case kCTCellularDataRestricted:
// app网络权限受限
//各种操作
break;
case kCTCellularDataRestrictedStateUnknown:
// app网络权限不确定
// 各种操作
break;
case kCTCellularDataNotRestricted:
// app网络权限不受限
// 各种操作
break;
default:
break;
}
};
做了个小测验,在设备没有开启网络的情况下,程序执行不会判断有没有网络,也就是说你的手机没联网,但是程序还是认为kCTCellularDataNotRestricted---所以上面的监测的只是应用程序的网络权限,并不能监测设备的网络状况(也是正常的,有点强迫症了)
获取app当前的网络权限用属性cellularData.restrictedState
2.实时监测手机的网络情况
在苹果官网搜reachability,下载reachability将Reachability.h 和 Reachability.m引入工程,导入SystemConfiguration.framework
开启网络监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChanged:) name:kReachabilityChangedNotification object:nil];
self.reachability = [Reachability reachabilityWithHostName:@"www.baidu.com"];
[self.reachability startNotifier];
- (void)networkChanged:(NSNotification *)notification{
Reachability *currentReach = [notification object];
NSParameterAssert([currentReach isKindOfClass:[Reachability class]]);
// 对连接改变做出响应处理动作
self.status = [currentReach currentReachabilityStatus];
self.isReachable = YES;
switch (self.status) {
case NotReachable:
{
//网络不可用,
//各种操作
break;
}
case ReachableViaWiFi:
{
// 蜂窝
//各种操作
break;
}
case ReachableViaWWAN:
{
// 蜂窝,wifi
//各种操作
self.isReachable = YES;
break;
}
default:
break;
}
}
// 移除监听
- (void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self ];
}
总结:
reachability不仅能判断设备有没有网,也能在手机断网而程序有联网权限时判定为无网状态, CTCellularData即使手机断网,只要网络权限开启,它也认为自己可以联网(因为有联网权限嘛),脑袋有点乱︿( ̄_ ̄)︿
这么一想,reachability已经能满足需求了,不过两者结合使用就可以知道:程序不能加载时,是网络没开启?还是自己没有网络权限了呢...
挺全的有关Ios10 系统问题