我刚经历了一场末日(停电),特别是在你想写文档的时候。。。

言归正传,今天的问题是解决iOS10系统下首次按钮APP弹出的网络权限提示所带来了问题以及优化。

起因

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

问题

Apple把自己的问题解决了, 但是Apple没有给出官方的获取选择事件的回调,这样就是给开发者挖坑了。
对于很多开发者习惯于把预加载接口放到AppDelegate的同志就很苦恼了。
这样会造成配置接口请求失败,首页数据为空的情况,第一次获取DeviceToken失败,添加推送通知失败,第三方初始化失败,以至于导致很多延伸的问题。

解决

1.根据CTCellularData类获取网络权限状态以及监听状态改变回调(推荐)

我就在使用此方法。话不多说上代码,注释很详细;
添加CoreTelephony系统库,在AppDelegate.m里#import<CoreTelephony/CTCellularData.h>
[objc] view plain copy
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  2. // Override point for customization after application launch.
  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. //初始化window
  11. self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  12. [self.window setBackgroundColor:[UIColor whiteColor]];
  13. //    //创建UI
  14. [self createWindowRootWithType:2];
  15. [self.window makeKeyAndVisible];
  16. return YES;
  17. }
  18. /*
  19. CTCellularData在iOS9之前是私有类,权限设置是iOS10开始的,所以App Store审核没有问题
  20. 获取网络权限状态
  21. */
  22. - (void)networkStatus:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  23. //2.根据权限执行相应的交互
  24. CTCellularData *cellularData = [[CTCellularData alloc] init];
  25. /*
  26. 此函数会在网络权限改变时再次调用
  27. */
  28. cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
  29. switch (state) {
  30. case kCTCellularDataRestricted:
  31. NSLog(@"Restricted");
  32. //2.1权限关闭的情况下 再次请求网络数据会弹出设置网络提示
  33. [self getAppInfo];
  34. break;
  35. case kCTCellularDataNotRestricted:
  36. NSLog(@"NotRestricted");
  37. //2.2已经开启网络权限 监听网络状态
  38. [self addReachabilityManager:application didFinishLaunchingWithOptions:launchOptions];
  39. //                [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
  40. break;
  41. case kCTCellularDataRestrictedStateUnknown:
  42. NSLog(@"Unknown");
  43. //2.3未知情况 (还没有遇到推测是有网络但是连接不正常的情况下)
  44. [self getAppInfo];
  45. break;
  46. default:
  47. break;
  48. }
  49. };
  50. }
  51. /**
  52. 实时检查当前网络状态
  53. */
  54. - (void)addReachabilityManager:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  55. AFNetworkReachabilityManager *afNetworkReachabilityManager = [AFNetworkReachabilityManager sharedManager];
  56. //这个可以放在需要侦听的页面
  57. //    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(afNetworkStatusChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
  58. [afNetworkReachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  59. switch (status) {
  60. case AFNetworkReachabilityStatusNotReachable:{
  61. NSLog(@"网络不通:%@",@(status) );
  62. break;
  63. }
  64. case AFNetworkReachabilityStatusReachableViaWiFi:{
  65. NSLog(@"网络通过WIFI连接:%@",@(status));
  66. if (self.mallConfigModel == nil) {
  67. [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
  68. }
  69. break;
  70. }
  71. case AFNetworkReachabilityStatusReachableViaWWAN:{
  72. NSLog(@"网络通过无线连接:%@",@(status) );
  73. if (self.mallConfigModel == nil) {
  74. [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
  75. }
  76. break;
  77. }
  78. default:
  79. break;
  80. }
  81. }];
  82. [afNetworkReachabilityManager startMonitoring];  //开启网络监视器;
  83. }
  84. - (void)getInfo_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  85. //第三方库初始化
  86. [self initValueThirdParty:application didFinishLaunchingWithOptions:launchOptions];
  87. //    //获取初始信息
  88. [self initData];
  89. //添加通知
  90. [self addNotification];
  91. }

这样也同时解决了用户如果选择不允许和限制两种情况,在用户没有统一联网的情况下,APP会显示没有网络的UI,重新进入APP会调用在不允许状态下会调用一个测试接口,APP会自动弹出重新选择网络权限以及说明的弹窗,进入设置修改过APP联网权限以后选择回到APP就会触发cellularDataRestrictionDidUpdateNotifier,在回调里进行相应的人机交互就可以了。

2.延迟请求

就是把配置请求放到首页VC里,不要放到AppDelegate里,同时监听网络状态(AF,其他第三方等)有个致命性的问题就是获取网络状态会有一定的延迟(亲测),导致很多情况,还有就是要自己处理权限弹框以及对原有代码逻辑要进行修改。

总结

这个问题遇到几次了,原来都是用第二种方式进行了一定的优化,这次的APP有一个配置信息接口导致出现问题,写下来作为记录,方法还有很多种,不足的地方还有很多,仅供大家参考。

转载于:https://www.cnblogs.com/Free-Thinker/p/8303261.html

iOS10 优化APP首次安装网络权限提示方案相关推荐

  1. Android 11.0 系统默认授予app安装权限(去掉app首次运行时权限授权弹窗)

    目录 1.概述 2.系统默认授予app安装权限去掉app首次运行时权限授权弹窗功能分析

  2. iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)

    转载自: 文/戴仓薯(简书作者) 原文链接:http://www.jianshu.com/p/6cbde1b8b922 症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动 ...

  3. iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”

    这个坑最近弄得我很抓狂,不过现在基本弄清楚了.记录一下过程中我收集到的信息,分享给大家. 症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白, ...

  4. iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”_前进的火车_新浪博客...

    这个坑最近弄得我很抓狂,不过现在基本弄清楚了.记录一下过程中我收集到的信息,分享给大家. 症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白, ...

  5. Synology Drive Client首次安装登录,提示:用户名/密码无效或用户权限不足

    安装Synology Drive Client登录的时候,提示用户名/密码无效或用户权限不足,检查了几次用户名密码都没有问题,域名也没有错,从网上找了找,说要设置权限,不管用 最后发现是用户名的问题 ...

  6. iOS10网络权限数据

    参考地址:1.http://www.cocoachina.com/ios/20180723/24274.html   https://blog.csdn.net/wang_bo_justone/art ...

  7. NETGEAR拒绝连接请求_iOS 14:为什么APP请求本地网络?想要扫描本地网络追踪

    随着iOS 14正式版的推送升级到新版本的用户越来越多 , 不过也有用户发现升级后系统在某些方面似乎有些变化. 比如屏幕顶部经常提示某某应用读取剪切板.音视频通话时屏幕顶部出现圆点,还有弹出本地网络访 ...

  8. iOS-检测 iOS 系统网络权限被关闭

    背景 一直都有用户反馈无法正常联网的问题,经过定位,发现很大一部分用户是因为网络权限被系统关闭,经过资料搜集和排除发现根本原因是: 第一次打开 app 不能访问网络,无任何提示 第一次打开 app 直 ...

  9. Android 11.0根据包名授予app所需的权限

    在11.0 定制开发中第三方app第一次进入的时候 会弹出授予权限的权限框 有时候觉得挺麻烦的,所以根据客户要求 默认授予权限,这时我们就需要根据包名PackageName 来给与所需要的权限 首选来 ...

最新文章

  1. 51Nod-1082 与7无关的数【进制+打表】
  2. 实验吧 登录一下好吗
  3. c语言数码管编写程序,跪求单片机0~99数码管显示用C语言编写的程序
  4. boost::compressed_sparse_row_graph用法的测试程序
  5. 安卓项目中文件夹的作用
  6. 【Splay】波动值之和(金牌导航 Splay-1)
  7. 来到博客园许久,却还未开始写一篇自己的博客。从今天开始,每周都会更新自己的学习内容。...
  8. Android项目实战(十):自定义倒计时的TextView
  9. access实验报告体会_Access2010实验报告
  10. oracle11g查看数据库名称,oracle11g系列 事物和常用数据库对象
  11. 阿辉,Bullet In The Head
  12. 陕西国防学院计算机系网络教研室,陕西国防工业职业技术学院:全卫强副院长赴各院部调研教师发展工作...
  13. Could not execute JDBC batch update异常的解决办法
  14. thinkphp3.2 数据库 AND OR连缀使用
  15. 打印ASCII码 c++
  16. mp2 解码器kjmp输出32bit
  17. f2fs系列文章truncate
  18. hiho1718(LIS)
  19. 免费代理池(proxy_pool)搭建教程
  20. 机器人届的“擎天柱”来了!能够在空中变形以快速栖息的四旋翼机器人

热门文章

  1. python去除图片上的文字_Python图像处理之识别图像中的文字(实例讲解)
  2. js实现modbus_nodejs中使用modbus-serial库创建Modbus TCP读取设备的数据
  3. 数据库:SQLServer数据库备份方式介绍
  4. 10个常见的JS语言错误总汇
  5. 盘点八个程序员必备的代码编辑器
  6. 程序员的10个快乐瞬间!
  7. 北漂、海漂的你,每个月发薪资支付生活成本后还剩多少钱
  8. Android 第八课 创建自定义控件
  9. 前端开发时间格式的转换方法_开发人员投资时间而不浪费时间的10种方法
  10. 中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?