iOS10的首次网络判断出错问题

问题以及背景

升级iOS10之后,绝大多数应用第一次进入都会提示无网络,首页是无网络状态。具体原因是iOS10新出现的网络鉴权授权机制,在网络访问未获得授权情况下,使用Reachability判断出的结果是:NotReachable.是属于无网络状况(此时非常有可能是有网络的)。如图

iOS10的首次网络判断出错问题_第1张图片
ScreenShot_20160929110221.png

问题分析

  1. 思路一:根据以往经验,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

iOS10的首次网络判断出错问题_第2张图片
AuthorizationStatus_-_Search_-_Apple_Developer.png

没有发现网络数据相关的api,应该是目前没有开放出来。此路不通

  1. 思路二:去看那些其他软件怎么做的,打开微信,设置->微信关闭无线数据
iOS10的首次网络判断出错问题_第3张图片
ScreenShot_20160929115344.png

再次打开微信

iOS10的首次网络判断出错问题_第4张图片
ScreenShot_20160929115404.png

根据思路一,google,github未发现对应API。自己做个Demo试验一下
关闭 无线数据之后,第一次进入程序

iOS10的首次网络判断出错问题_第5张图片
ScreenShot_20160929115904.png
  • 结论
  1. iOS10系统做了判断处理,用户无法干涉。
  2. 当点击允许或者不允许,均无直接回掉。所以用户并不能根据当前网络状态,正确处理当前网络请求。

解决方案

但是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)
    {
    
    }
}

你可能感兴趣的:(iOS10的首次网络判断出错问题)