App首次安装 - 授权网络访问的坑

news/2024/7/20 21:28:46 标签: ios, 网络权限, iOS10, 弹框

#App首次安装 - 授权网络访问的坑

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

###1.这个弹框到底是个啥?
这里写图片描述

###2.怎么能够触发
1.首先,你得有一台国行版本的iPhone手机.
2.系统版本在iOS10以上
3.首次安装一个App时,App只要进行网络请求,网络交换.就会触发以上.
###3.是不是每次都会弹?卸载以后重装App呢?
只有在首次安装App并触发网络请求后,才会触发这个询问弹框.并且一定会让用户对该App明确一个网络权限状态(wifi/wifi+4g3g2g/notNetwork),否则这个弹框是不会消失的.

##项目中遇到的问题以及解决办法

###1.遇到的问题

  1. 项目的情况比较特殊,首先没有使用AFN,不过这也没什么关系.主要是项目App的一些数据加载和启动,必须在登陆前.一开始这些网络交换放在了didFinishLaunchingWithOptions里面.
    这会导致一个坑,就是此时Window还没有rootcontroller,所以就算触发了系统弹框有时候也不一定出现弹框,或者弹框会出现在关闭App之后.
  2. 第二个坑:由于苹果没有开方给我们对于网络权限请求的API.所以,我们也拿不到用户的点选结果,到底用户是允许了还是没允许.一般来说,只能通过不断去检测网络,来判断用户的授权情况.

###2.解决办法(怎么样优雅的避免尴尬)
敲黑板
首先,在真正的数据加载/网络交换之前.使用定时器去不断的去发起网络检测.只有等到用户授权了,再次检测到网络连通以后,才去真正的做数据交互.
如果检测到网络未连接(其中有坑,网络检测有AFN/Reachability,但问题是,在用户决定授权前,检测返回的结果也是无网络,不像相机/相册等权限的枚举,有个未决的状态),那么就让定时器继续不断发起网络检测.

那么问题来了:
用户不允许网络行为之后,AFN/Reachability返回的结果依然是无网络连接.

####解决办法:
这里,在定时器之前,先自定义一个弹框提示,此弹框必然弹出,该弹框的作用是提示用户,引导用户跳转设置去自行解决网络问题
再用户选择授权/拒绝授权后,检测网络连接情况,若已经连接,则进行数据交互且移除自定义的弹框,若用户决绝授权,则显示此弹框

注意,国行手机系统弹框必然会覆盖在所有弹框之上

- (void)checkNetwork{
    
    //网络状态预判断
    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];
            });
        }
    }
    
}

http://www.niftyadmin.cn/n/1557228.html

相关文章

粪叉(iPhone X)的适配

粪叉(iPhone X)的适配 参考链接:苹果官方适配详解 参考链接:Xcode的基本操作与配置 参考链接:iOS11和iPhone X的适配 参考链接:三分钟弄懂iPhone X 设计尺寸和适配 参考链接:iPhone X适配之启动图适配教程 参考链接:iPhone X适配没那么复杂,但也不是看上去这么…

[转]清理mac的硬盘空间,清理Xcode,清除“其他”

清理mac的硬盘空间,清理Xcode,清除“其他” https://www.jianshu.com/p/8c633d29cb71

进入页面,根据后台传过来的flag 判断列表隐藏与否

需求描述:页面中有两个列表,一个已添加,一个可以添加,进入页面的时候,如果已添加中有数据则显示,没有数据就隐藏,emmmm,这种需求,我该怎么吐槽嗷嗷嗷 解决思路&#xff1…

上架失败之适配ATS

上架失败之适配ATS 参考连接:AFNetwork 3.0 源码解读(五)AFSecurityPolicy 参考连接:iOS开发HTTPS实现之信任SSL证书和自签名证书 参考连接:IOS-关于App Transport Security相关说明及适配 参考连接:https信任证书的三种方 参考连接:iOS开发&#x…

高程3总结#第24章最佳实践

最佳实践 可维护性 什么是可维护性的代码 如果说代码是可维护的,它需要遵循以下特点 可理解性——其他人可以接手代码并理解它的意图和一般途径,而无需原开发人员的完整解释。直观性——代码中的东西一看就能明白,不管其操作过程多么复杂。可…

[iOS UILable]获取不同屏幕下,真正的lab高度

[iOS UILable]获取不同屏幕下,真正的lab高度 CGSize labSize [someLab sizeThatFits:CGSizeZero];//get lab.size.width CGSize LabSizeW labSize.width;//get lab.size.height CGSize LabSizeH (scale * someLab.font.pointSize);ps: scale参数 scale参数为 UI给出的控件…

P1171 售货员的难题 暴力dp

题面 著名的TSP问题&#xff0c;NPC问题 对于数据大的情况&#xff0c;我们可以使用一系列近似算法进行寻找解。 对于数据规模小的情况&#xff0c;我们可以直接暴力dp 一开始写了一个dfs&#xff0c;然后就被n20的数据卡爆了 #include<cstdio> #include<iostream>…

[iOS KVC+Runtime , 获取类中的属性名,为不存在的key赋值]

有时候后端下发的json对象并不存在某个key(某个字段没有下发), 这时候使用kvc去获取对象的值,虽然不会报错(约定均返回字符串),但实际此model对象的某个属性值是为nil的 比如 UserInfo.h 有个属性 property (nonatomic, strong) NSString *userId;//用户ID//当后端返回的js…