问题以及背景
升级iOS10之后,绝大多数应用第一次进入都会提示无网络,首页是无网络状态。具体原因是iOS10新出现的网络鉴权授权机制,在网络访问未获得授权情况下,使用Reachability判断出的结果是:NotReachable.是属于无网络状况(此时非常有可能是有网络的)。如图
问题分析
- 思路一:根据以往经验,iOS7之后出现的相机、通知等鉴权。有对应的API来判断,如果没有权限可以让程序自动跳转到设置页面,让用户去设置。例如:
- (BOOL)isCameraValid
{
double version = [[UIDevice currentDevice].systemVersion doubleValue];
if(version>=7.0f){
// 判断程序的隐私设置是否授予权限
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus != AVAuthorizationStatusAuthorized)
{
return NO;
}
}
return YES;
}
在XCode Dcouments里边,以及https://developer.apple.com/search里搜索AuthorizationStatus
没有发现网络数据相关的api,应该是目前没有开放出来。此路不通
- 思路二:去看那些其他软件怎么做的,打开微信,
设置->微信
关闭无线数据
再次打开微信
根据思路一,google,github未发现对应API。自己做个Demo试验一下
关闭
无线数据
之后,第一次进入程序
- 结论
- iOS10系统做了判断处理,用户无法干涉。
- 当点击允许或者不允许,均无直接回掉。所以用户并不能根据当前网络状态,正确处理当前网络请求。
解决方案
但是Reachability会在授权界面点击允许之后,有回掉。可以通过此回掉来正确处理当前网络请求。也就是在首页或者其他需要相关请求注册通知kReachabilityChangedNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
在回掉函数里进行重新请求
- (void) reachabilityChanged:(NSNotification *)note
{
//
Reachability* curReach = [note object];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
//发送请求
if(netStatus!=NotReachable)
{
}
}