iOS10系统网络权限问题及实时监测网络状态问题

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 系统问题

你可能感兴趣的:(iOS10系统网络权限问题及实时监测网络状态问题)