iOS 应用第一次安装未得到网络权限处理

打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

前提

由于大陆工信部出台的新规指出,应用在未经用户允许的前提下,体系不能授予其使用联网、获取定位的功能。Apple在iOS10体系中加入了关于应用使用数据的授权弹窗提示,用户在iOS体系及以上体系中第一次打开应用时,会被要求对于是否授予应用联网权限进行选择。
题目

很多开发者风俗把预加载接口放到AppDelegate的- (BOOL)applicationUIApplication *)application didFinishLaunchingWithOptionsNSDictionary *)launchOptions方法里面,但是如今第一次安装,默认是没有联网本领的,按之前的写法会导致配置接口哀求失败,首页数据为空,第一次获取DeviceToken失败,添加推送通知失败,第三方初始化失败等等一系列题目。
办理方法

使用CTCellularData加AFNetworkReachabilityManager

CTCellularData类用于获取网络权限状态以及监听状态改变回调

AFNetworkReachabilityManager用于实时监测当前的网络状态

上代码

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  2.    
  3.     //1.获取网络权限 根据权限进行人机交互
  4.        if (__IPHONE_10_0) {
  5.            [self networkStatus:application didFinishLaunchingWithOptions:launchOptions];
  6.        }else {
  7.            //2.2已经开启网络权限 监听网络状态
  8.            [self addReachabilityManager:application didFinishLaunchingWithOptions:launchOptions];
  9.        }
  10.     self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0,0, KScreenWidth, KScreenHeight)];
  11.     self.window.backgroundColor = [UIColor whiteColor];
  12.     MainViewController *vc = [[MainViewController alloc] init];
  13.     self.window.rootViewController = vc;
  14.     [self.window makeKeyAndVisible];
  15.     return YES;
  16. }
复制代码
  1. /*
  2. 获取网络权限状态
  3. */
  4. - (void)networkStatus:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  5.     //2.根据权限执行相应的交互
  6.     CTCellularData *cellularData = [[CTCellularData alloc] init];
  7.       
  8.     /*
  9.      此函数会在网络权限改变时再次调用
  10.      */
  11.     cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
  12.         switch (state) {
  13.             case kCTCellularDataRestricted:
  14.                   
  15.                 NSLog(@"Restricted");
  16.                 //2.1权限关闭的情况下 再次请求网络数据会弹出设置网络提示
  17.                
  18.                 break;
  19.             case kCTCellularDataNotRestricted:
  20.                   
  21.                 NSLog(@"NotRestricted");
  22.                 //2.2已经开启网络权限 监听网络状态
  23.                 [self addReachabilityManager:application didFinishLaunchingWithOptions:launchOptions];
  24.                 break;
  25.             case kCTCellularDataRestrictedStateUnknown:
  26.                   
  27.                 NSLog(@"Unknown");
  28.                
  29.                 break;
  30.                   
  31.             default:
  32.                 break;
  33.         }
  34.     };
  35. }
复制代码
  1. /**
  2. 实时检查当前网络状态
  3. */
  4. - (void)addReachabilityManager:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  5.     AFNetworkReachabilityManager *afNetworkReachabilityManager = [AFNetworkReachabilityManager sharedManager];
  6.       
  7.     [afNetworkReachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  8.         switch (status) {
  9.             case AFNetworkReachabilityStatusNotReachable:{
  10.                 NSLog(@"网络不通:%@",@(status) );
  11.                 break;
  12.             }
  13.             case AFNetworkReachabilityStatusReachableViaWiFi:{
  14.                 NSLog(@"网络通过WIFI连接:%@",@(status));
  15.             
  16.                 [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
  17.             
  18.                 break;
  19.             }
  20.             case AFNetworkReachabilityStatusReachableViaWWAN:{
  21.                 NSLog(@"网络通过无线连接:%@",@(status) );
  22.               
  23.                 [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
  24.             
  25.                 break;
  26.             }
  27.             default:
  28.                 break;
  29.         }
  30.     }];
  31.       
  32.     [afNetworkReachabilityManager startMonitoring];  //开启网络监视器;
  33. }
复制代码
  1. //把以前写在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions里面的一些初始化操作放在该方法
  2. - (void)getInfo_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  3.       
  4.     [self.updateBusiness  checkUpdateWithBothApi];//检查app更新
  5.    
  6. //发送通知给APP首屏页面,让其有网络时重新请求
  7.     [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingReachabilityDidChangeNotification object:nil];
  8. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表