App首次安装 - 授权网络访问的坑
App首次安装 - 授权网络访问的坑
参考链接:iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”
1.这个弹框到底是个啥?
2.怎么能够触发
1.首先,你得有一台国行版本的iPhone手机.
2.系统版本在iOS10以上
3.首次安装一个App时,App只要进行网络请求,网络交换.就会触发以上.
3.是不是每次都会弹?卸载以后重装App呢?
只有在首次安装App并触发网络请求后,才会触发这个询问弹框.并且一定会让用户对该App明确一个网络权限状态(wifi/wifi+4g3g2g/notNetwork),否则这个弹框是不会消失的.
项目中遇到的问题以及解决办法
1.遇到的问题
项目的情况比较特殊,首先没有使用AFN,不过这也没什么关系.主要是项目App的一些数据加载和启动,必须在登陆前.一开始这些网络交换放在了didFinishLaunchingWithOptions 里面.
这会导致一个坑,就是此时Window还没有rootcontroller,所以就算触发了系统弹框有时候也不一定出现弹框,或者弹框会出现在关闭App之后.
第二个坑:由于苹果没有开方给我们对于网络权限请求的API.所以,我们也拿不到用户的点选结果,到底用户是允许了还是没允许.一般来说,只能通过不断去检测网络,来判断用户的授权情况.
2.解决办法(怎么样优雅的避免尴尬)
敲黑板
首先,在真正的数据加载/网络交换之前.使用定时器去不断的去发起网络检测.只有等到用户授权了,再次检测到网络连通以后,才去真正的做数据交互.
如果检测到网络未连接(其中有坑,网络检测有AFN/Reachability,但问题是,在用户决定授权前,检测返回的结果也是无网络,不像相机/相册等权限的枚举,有个未决的状态),那么就让定时器继续不断发起网络检测.
那么问题来了:
用户不允许网络行为之后,AFN/Reachability返回的结果依然是无网络连接.
解决办法:
这里,在定时器之前,先自定义一个弹框提示,此弹框必然弹出,该弹框的作用是提示用户,引导用户跳转设置去自行解决网络问题
再用户选择授权/拒绝授权后,检测网络连接情况,若已经连接,则进行数据交互且移除自定义的弹框,若用户决绝授权,则显示此弹框
注意,国行手机系统弹框必然会覆盖在所有弹框之上
//网络状态预判断 netWork = [[SDNetwork alloc] init]; netWorkType = [netWork integerWithNetworkType]; /* *第一次网络状态返回, 弹出自定义提示 - (避免由于一直无法检测到网络而无交互导致用户误解) *第一次网络状态返回,or国行手机网络权限导致无网络/or用户飞行模式/or用户曾主动关闭网络 *均弹出友好提示 - 引导用户尝试解决网络问题. *首次安装App,该弹出会被 国行手机权限询问弹框所遮挡,待用户决定App是否使用网络后,再去引导用户进行设置 */ if (netWorkType == 0) { // 引导用户去系统设置 [[SDAlertView shareAlert] showDialog:@"无网络连接" message:@"1.检查是否触发了飞行模式,关闭即可 \n\n2.检查是否关闭了网络权限,请授权杉德宝访问网络,操作方法(设置-蜂窝移动网络-杉德宝)" leftBtnString:@"退出杉德宝" rightBtnString:@"去设置" leftBlock:^{ [Tool exitApplication:self]; } rightBlock:^{ [Tool openUrl:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; [Tool exitApplication:self]; }]; } //定时器 timer = [NSTimer timerWithTimeInterval:1.f target:self selector:@selector(netWorkRequest) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; } - (void)netWorkRequest{ /* *检测网络状态 - 无网络 *继续执行定时器 */ if (netWorkType == 0) { NSLog(@"检测到无网络/未决,继续检测"); netWorkType = [netWork integerWithNetworkType]; } /* *检测网络状态 - 有网络 *定时器停止 *隐藏之前弹出的 @"无网络连接" 提示弹框 *执行大Loading */ else{ if (timer) { [timer invalidate]; timer = nil; [[SDAlertView shareAlert] hideDialogAnimation:NO]; NSLog(@"检测到有网络,执行大Loading"); dispatch_async(dispatch_get_global_queue(DISPATCH_TARGET_QUEUE_DEFAULT, 0), ^{ [self BigLoading]; }); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)