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

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

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



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




2.延迟请求

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

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

su命令

从一个用户切换到另一个用户&#xff1a;su - ceshi(ceshi是用户名) 查看当前用户&#xff1a;whoami 在不切换用户的情况执行另一个用户的命令&#xff1a;例&#xff1a;su - -c "touch /tmp/111.txt" admin 若用户没有加目录需要添加家目录&#xff0c;并更改所有…

PS批量替换内容

在制作图片物料的时候&#xff0c;有时会碰到需要制作大量内容格式一致&#xff0c;但部分文字或图片不同的图片&#xff0c;这里我们使用PS的变量功能 物料准备&#xff1a;准备好需要替换的图片和文字&#xff0c;使用excel制作出需要替换的内容&#xff0c;第一行name和pic…

在 .NET 中执行 JavaScript 代码

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具和组件&#xff0c;希望对您有用&#xff01;Jint 简介如果您想在您的 .NET 程序中使用 Javascript&#xff0c;那么我推荐您使用 Jint。Jint 是适用于 .NET 的 开源 Javascript 解…

jmeter多用户登录跨线程组操作传值

项目需求&#xff1a; 需要登录两个用户A、B&#xff0c;用户A操作完后会通知B&#xff0c;然后B再操作&#xff0c;B操作完结束或者再通知A。 实现思路&#xff1a; 1. 设置两个线程组Ⅰ、Ⅱ&#xff0c;组Ⅰ添加cookie管理器&#xff0c;里面添加用户A的操作&#xff1b;组Ⅱ…

手动修改美化7zip图标 - 附替换文件

手动修改7zip图标理论知识制作ico图标文件替换资源重建图标缓存效果图替换文件7-Zip的自带图标是公认的丑&#xff0c;所以网上有很多7-Zip的图标美化工具&#xff0c;用的最多的就是 7-Zip Theme Manager&#xff0c;自带很多主题&#xff0c;但是最近我再使用7zTM修改图标是却…

.NET性能优化-复用StringBuilder

在之前的文章中&#xff0c;我们介绍了 dotnet 在字符串拼接时可以使用的一些性能优化技巧。比如&#xff1a;为StringBuilder设置 Buffer 初始大小使用ValueStringBuilder等等 不过这些都多多少少有一些局限性&#xff0c;比如StringBuilder还是会存在new StringBuilder()这样…

如何使用vue组件搭建网页并打包发布

vue组件化项目搭建及编译打包发布引言开发环境开发环境介绍开发环境安装使用模板创建项目编译及打包发布引言 最近开始学习Vue&#xff0c;Vue 是一个前端框架&#xff0c;特点是数据绑定和组件化。网上很多教程&#xff0c;数据绑定和组件学习起来也都不困难&#xff0c;但是…

Facebook揭秘其应用测试平台,并开源核心技术

本周&#xff0c;Facebook让一群记者参观了它位于俄勒冈州普赖恩维尔市的数据中心&#xff0c;在这个过程中也展示了他们的一个移动应用测试实验室&#xff0c;用来测试Facebook app、 Messenger 和Instagram。 目前 这个实验室总共含有60个机架&#xff0c;每个机架上放置32台…

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;职责链模式意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系将这些对象连接成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一个对象处理它为止。责任…

YOLOv7 在 ML.NET 中使用 ONNX 检测对象

本文介绍如何在 ML.NET 中使用 YOLOv7 的 ONNX 模型来检测图像中的对象。什么是 YOLOYOLO&#xff08;You Only Look Once&#xff09;是一种先进的实时目标检测系统。它是一个在COCO数据集上预训练的物体检测架构和模型系列&#xff0c;其版本也是在不断优化更新。2022年7月&a…

NppFTP小插件的使用

大家在Linux系统中配置运行环境时&#xff0c;一定会遇到相关配置文件的修改&#xff0c;虽说在Linux系统中可以使用vi,vim的命令进行文本编辑&#xff0c;但是操作起来还是没有在Windows系统中用的爽&#xff0c;特别是操作大文本量的文件时。Notepad里提供了一个小插件&#…

『实战』使用Excel催化剂二维码功能批量生成带不同图案二维码。

熟悉Excel催化剂的老读者都知道&#xff0c;每逢图书大促&#xff0c;笔者都会向出版社申请优惠码优惠券来惠及广大粉丝。当然公众号上帮出版社推荐图书&#xff0c;会有佣金回报&#xff0c;这也是笔者唯一能接受的推广方式。公众号自创立以来&#xff0c;没有接过软文&#x…

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

JavaScriptSerializer 类由异步通信层内部使用&#xff0c;用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象。要添加System.Web.Extensions.dll的引用。该类位于System.Web.Script.Serialization命…

使用vue组件搭建网页应用

使用vue组件搭建网页应用搭建开发环境开发组件搭建开发环境 搭建一个 vue 项目最快的方式就是使用 vue cli 脚手架进行初始化&#xff0c;包含了所有完整的依赖及开发配置。 首先全局安装 vue cli&#xff0c;打开 cmd 命令提示符 或者 power shell&#xff0c;输入以下命令&…

重新整理 .net core 实践篇 —linux上排查问题实用工具 [外篇]

前言介绍下面几个工具:Lldbcreatedumpdotnet-dumpdotnet-gcdumpdotnet-symbolProcdump该文的前置篇为:https://www.cnblogs.com/aoximin/p/16839812.html献给初学者&#xff0c;这篇就只介绍下看下日志和lldb&#xff0c;毕竟东西太多了。正文我以官网的例子作为演示&#xff1…

Office 365离线安装

Office 365除了可以在线安装外&#xff0c;还可以进行离线安装&#xff0c;但激活还是需要连接互联网的哟首先下载Office部署工具https://www.microsoft.com/en-us/download/details.aspx?id49117 下载文件后&#xff0c;运行自解压缩可执行文件&#xff0c;其中包含 Office 部…

reduceByKey和groupByKey区别与用法

2019独角兽企业重金招聘Python工程师标准>>> 在Spar看中&#xff0c;我们知道一切的操作都是基于RDD的。在使用中&#xff0c;RDD有一种非常特殊也是非常实用的format——pair RDD&#xff0c;即RDD的每一行是&#xff08;key, value&#xff09;的格式。这种格式很…

软件工程的第一性原理丨SmartIDE

作者&#xff1a;徐磊原文地址&#xff1a;https://smartide.cn/zh/blog/2022-1022-software-engineering/徐磊英捷创软科技&#xff08;北京&#xff09;有限公司创始⼈/⾸席架构师 / CEO / SmartIDE开源项⽬创始⼈。微软最有价值专家MVP&#xff0c;微软区域技术总监&#xf…

排序算法之快速排序详解

一、算法介绍 快速排序&#xff1a;快速排序的基本思想是通过一次排序将等待的记录分成两个独立的部分&#xff0c;其中一部分记录的关键字小于另一部分的关键字。C部分的快速排序一直持续到整个序列被排序。 任取一个元素 (如第一个) 为中心提出所有小于它的元素&#xff0c;并…

openstack 中国联盟公开课參会总结

主流趋势 1. openstack defcore 互操作性认证。打通不同的openstack 厂商之间的连接2. 首批OpenStack管理员认证(COA)将于2016年进行3. 混合云应用广泛 Cloud Broker,cascading openstack 云连接器4. DevOps5. 虚拟桌面6. Storage 方面&#xff0c;Ceph和Glusterfs 7. Network…