• 言归正传,今天的问题是解决iOS10系统下首次按钮APP弹出的网络权限提示所带来了问题以及优化。 起因   查了相关文章知道由于大陆工信部出台的新规指出,应用在未经用户允许的前提下,系统不能授予其使用联网、...

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

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

    起因

     

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

     

    问题

    Apple把自己的问题解决了, 但是Apple没有给出官方的获取选择事件的回调,这样就是给开发者挖坑了。

    对于很多开发者习惯于把预加载接口放到AppDelegate的同志就很苦恼了。

    这样会造成配置接口请求失败,首页数据为空的情况,第一次获取DeviceToken失败,添加推送通知失败,第三方初始化失败,以至于导致很多延伸的问题。

    解决

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

    我就在使用此方法。话不多说上代码,注释很详细;

    添加CoreTelephony系统库,在AppDelegate.m里#import<CoreTelephony/CTCellularData.h>

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        //1.获取网络权限 根绝权限进行人机交互
        if (__IPHONE_10_0) {
            [self networkStatus:application didFinishLaunchingWithOptions:launchOptions];
        }else {
            //2.2已经开启网络权限 监听网络状态
            [self addReachabilityManager:application didFinishLaunchingWithOptions:launchOptions];
        }
        
        //初始化window
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        [self.window setBackgroundColor:[UIColor whiteColor]];
        
    //    //创建UI
        [self createWindowRootWithType:2];
        
        [self.window makeKeyAndVisible];
        return YES;
    }
    
    /*
     CTCellularData在iOS9之前是私有类,权限设置是iOS10开始的,所以App Store审核没有问题
     获取网络权限状态
     */
    - (void)networkStatus:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        //2.根据权限执行相应的交互
        CTCellularData *cellularData = [[CTCellularData alloc] init];
        
        /*
         此函数会在网络权限改变时再次调用
         */
        cellularData.cellularDataRestrictionDidUpdateNotifier = ^(CTCellularDataRestrictedState state) {
            switch (state) {
                case kCTCellularDataRestricted:
                    
                    NSLog(@"Restricted");
                    //2.1权限关闭的情况下 再次请求网络数据会弹出设置网络提示
                    [self getAppInfo];
                    break;
                case kCTCellularDataNotRestricted:
                    
                    NSLog(@"NotRestricted");
                    //2.2已经开启网络权限 监听网络状态
                    [self addReachabilityManager:application didFinishLaunchingWithOptions:launchOptions];
    //                [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
                    break;
                case kCTCellularDataRestrictedStateUnknown:
                    
                    NSLog(@"Unknown");
                    //2.3未知情况 (还没有遇到推测是有网络但是连接不正常的情况下)
                    [self getAppInfo];
                    break;
                    
                default:
                    break;
            }
        };
    }
    
    /**
     实时检查当前网络状态
     */
    - (void)addReachabilityManager:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        AFNetworkReachabilityManager *afNetworkReachabilityManager = [AFNetworkReachabilityManager sharedManager];
        
        //这个可以放在需要侦听的页面
        //    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(afNetworkStatusChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
        [afNetworkReachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            switch (status) {
                case AFNetworkReachabilityStatusNotReachable:{
                    NSLog(@"网络不通:%@",@(status) );
                    break;
                }
                case AFNetworkReachabilityStatusReachableViaWiFi:{
                    NSLog(@"网络通过WIFI连接:%@",@(status));
                    if (self.mallConfigModel == nil) {
                       [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
                    }
                    break;
                }
                case AFNetworkReachabilityStatusReachableViaWWAN:{
                    NSLog(@"网络通过无线连接:%@",@(status) );
                    if (self.mallConfigModel == nil) {
                        [self getInfo_application:application didFinishLaunchingWithOptions:launchOptions];
                    }
                    break;
                }
                default:
                    break;
            }
        }];
        
        [afNetworkReachabilityManager startMonitoring];  //开启网络监视器;
    }
    
    - (void)getInfo_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        //第三方库初始化
        [self initValueThirdParty:application didFinishLaunchingWithOptions:launchOptions];
        
    //    //获取初始信息
        [self initData];
        
        //添加通知
        [self addNotification];
    }

     

     

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

    2018年08月09日更新

    这段时间一直出现微信没有注册的问题,不是必现而且只有线上存在,推荐大家第三方库(特别是需要网络的库)的初始化不需要放到判断网络权限里面,直接初始化。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
            
        //默认更新
        self.appIsUpdate = YES;
        
        //1.获取网络权限 根绝权限进行人机交互
        if (IS_IOS_(10)) {
            [self networkStatus:application didFinishLaunchingWithOptions:launchOptions];
        }else {
            //2.2已经开启网络权限 监听网络状态
            [self addReachabilityManager:application didFinishLaunchingWithOptions:launchOptions];
        }
        
        //初始化第三方库
        [self initValueThirdParty:application didFinishLaunchingWithOptions:launchOptions];
        
        //启动页停留1秒钟。
        [NSThread sleepForTimeInterval:1.0];
        
        //初始化window
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        [self.window setBackgroundColor:[UIColor whiteColor]];
        
        //创建主视图
        if ([DataBase nowUser]) {
            
            [self createWindowRootWithType:2];
        }else {
            
            [self createWindowRootWithType:1];
        }
        
        [self.window makeKeyAndVisible];
        return YES;
    }

    2.延迟请求

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

     

    总结

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

     

     

     

     

     

     

     

     

     

    展开全文
  • 若不想写繁琐的网络状况判断代码,并且应用程序能自动在无网络时弹出可跳转到系统设置页面的对话框,那么可以考虑这么做。 在项目中相应的**info.plist文件中增加一个关键字: SBUsesNetwork 应用程序就会自动...
    若不想写繁琐的网络状况判断代码,并且应用程序能自动在无网络时弹出可跳转到系统设置页面的对话框,那么可以考虑这么做。
    在项目中相应的**info.plist文件中增加一个关键字:
    <key>SBUsesNetwork</key>
    <true/>

    应用程序就会自动检测网络状况,在网络异常的情况下,会弹出网络设置对话框提醒用户是否进行网络设置,并且可以跳转至系统设置中进行昂立设置。


    其实在IOS5.1+之后,苹果就删除了程序跳转至设置界面的功能了,不知道为什么。。。

    所以自己写代码也是不可能实现的,只能够对网络进行监听,然后提醒用户网络链接异常而已。

    下面是监听网络改变的代码,可以参考一下:

    在AppDelegate.m中写如下代码:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        
        //开启网络状况的监听
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
        
        self.hostReach = [Reachability reachabilityWithHostName:@"www.baidu.com"] ;
        [self.hostReach startNotifier];  //开始监听,会启动一个run loop
    
        self.window.rootViewController = self.tabBarController;
        [self.window makeKeyAndVisible];
        return YES;
    }
    
    //网络链接改变时会调用的方法
    -(void)reachabilityChanged:(NSNotification *)note
    {
        Reachability *currReach = [note object];
        NSParameterAssert([currReach isKindOfClass:[Reachability class]]);
        
        //对连接改变做出响应处理动作
        NetworkStatus status = [currReach currentReachabilityStatus];
        //如果没有连接到网络就弹出提醒实况
        self.isReachable = YES;
        if(status == NotReachable)
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络连接异常" message:@"暂无法访问书城信息" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
            [alert show];
            [alert release];
            self.isReachable = NO;
        }
        else
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络连接信息" message:@"网络连接正常" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
            [alert show];
            [alert release];
            self.isReachable = YES;
        }
    }
    

    通过如上代码,在应用程序的任何一个界面都可以使用下面的单例来判断网络是否连接

        AppDelegate *appDlg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        if(appDlg.isReachable)
        {
            NSLog(@"网络已连接");//执行网络正常时的代码
        }
        else
        {
            NSLog(@"网络连接异常");//执行网络异常时的代码
        }
    

    然后就可以执行响应的操作了,这样使用监听的好处就是,不必在每一个需要检测网络链接情况的地方都写一大堆代码,只需要上面的监听,网络改变的时候,在任何一个地方都可以自定提醒用户。

    监听就是这样滴好用,(*^__^*) 嘻嘻……任何对象都可以接收。


    展开全文
  • iOS 模拟器网络设置

    2019-09-27 15:09:00
    iOS Simulator 下,点上面菜单栏最左面的苹果标志,第三项 网络设置,然后先最后面一项,网络设置。 然后在网络设置界面下可以开启或关闭网络。 转载于:https://www.cnblogs.com/davesuen/p/4172900.html...

    在 iOS Simulator 下,点上面菜单栏最左面的苹果标志,第三项 网络设置,然后先最后面一项,网络设置。

    然后在网络设置界面下可以开启或关闭网络。

    转载于:https://www.cnblogs.com/davesuen/p/4172900.html

    展开全文
  • Apple 在 iOS 10 操作系统中加入了关于应用使用数据的授权弹窗提示,用户在 iOS 10 系统中第一次打开应用时,会被要求对于是否授予应用联网权限进行选择。 不过,新的权限系统的引入也带来了一个 iOS 10 的新 bug。...
    
    

    前言

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

    不过,新的权限系统的引入也带来了一个 iOS 10 的新 bug。

    如果你在 iOS 10 操作系统中安装了一个新应用或者第一次打开某个应用时发现应用出现无法访问网络无法刷新数据的情况,并且在蜂窝数据网络的设置项中无法找到相应应用的联网权限设置选项,恭喜你,你中招了。

    目前已知的是,关于应用使用数据的权限完全由 iOS 10 系统控制,开发者无法针对此设置项进行检查或者开发主动请求联网权限的功能,在 Apple 针对此 bug 发布系统更新之前,你可能需要手动解决相关应用的网络连接问题。


    问题原因

    由于这个问题的原因来自 iOS 10 系统没有正确地配置网络权限,所以触发一下系统的相关设置改动可能能够重新激活应用的联网权限请求弹窗。对于开发者来说不幸的是,苹果这个功能可能出得太仓促,并没有给开发者提供相应的 API。所以,我们没办法检测到用户点击“允许”或“不允许”网络请求的回调,也没法检测到当前用户是否授权的状态。只能通过一些特殊处理,来尽量减小对用户的影响。当用户没法正常使用 App,第一反应会怪罪于这款 App 的开发者,这种情况下,用户通常都会认为是 App 而非系统的问题。

    解决方案

    由于这个 Bug 是系统级别的,所以暂时没有方便的解决方案。

    下面总结几条目前可行的解决方案:

    • 方法 1:多退出重进几次 App,有一定几率会弹出提示框。
    • 方法 2:在「设置 - 蜂窝移动网络」内打开「无线局域网助理」开关,再进入无法联网的 App,会弹出提示框。解决之后,就可以关掉助理开关。PS:(无线助理 是当wifi信号不好或者丢失的时候会使用手机的 移动蜂窝数据网络 访问,这样会跑流量,这个方法目前最有效)
    • 方法 3:先去设置里随意关闭一个 App 的联网权限,然后打开,再进入无法联网的 App,会弹出提示框

    小结


    就功能本身来说,这个「中国特供」确实是 iOS 在 App 联网权限管理方面的进步,它让用户能更主动地控制自己手机内各个 App 访问网络的权限,当出现流量使用异常的情况时,我们能够更容易找到偷跑流量的原因和对应 App,并马上对其作出权限限制。

    只不过,可能因为这是苹果工程师收到的「临时需求」,这一功能目前还不够完善,从而导致我们在日常使用上可能会遇到一些不便,只能等 iOS 10 后续的系统更新了。






    展开全文
  • 最近不少手机都升级了ios10.0系统,在调试的过程中发现,咱家的app无法连接到网络,然后去手动设置网络权限开启,但是根本找不到这个app。 据说这是ios10的bug,解决办法之一就是升级ios10.1beta系统 ,貌似修复...

    最近不少手机都升级了ios10.0系统,在调试的过程中发现,咱家的app无法连接到网络,然后去手动设置网络权限开启,但是根本找不到这个app。

    据说这是ios10的bug,解决办法之一就是升级ios10.1beta系统 ,貌似修复了这个问题。

    另一个解决办法就是,去随便一个可以连接网络的app,设置它的网络权限为关闭,然后打开这个app,会自动弹出一个提示开启网络权限的提示框,然后随便开启还是关闭都行,主要是让它弹出那个框。

    接下来回到连不上网的那个app,打开它你会发现弹出了和刚才一样的提示框,记住这次选择开启网络设置,app就能上网了。

    展开全文
  • iOS 10系统第安转会提示是否允许使用网络,这个时候会有一个空档,很多app如果没有引导页的话就直接进入主页,那么可能会出现网络无法请求的问题,解决问题之一:进入主页直接设置一个过渡控制器,在控制器内作处理...
  • ios设备没有网络的情况下,在app中如何弹出设置无线网络的提示框 这种情况基本上有两种解决方案 方案一: 适用范围:ios5.0及之前的iOS版本 方法:这是一个广为流传的办法,不再赘述,自己写一个alert...
  • 苹果在iOS系统中预置了网络调试工具,但是只有添加过测试设备,并使用Xcode连接下设备才能激活 1.Xcode未连接前 2.Xcode连接后发现设置中多出来一项:开发者 3.选择Status 4.选择需要模拟的网络状态 • 注意点:...
  • 在这篇博客中,我将用苹果自带的网络请求方式(不使用第三方框架)下对iOS网络请求方法做一个汇总。我将在之后的博客中介绍使用AFNetworking框架进行请求的实现。代码已经上传至:...
  • 以前iOS9上只有蜂窝访问权限,不过默认都是允许访问,可以自行去设置里面关闭。 而iOS10针对国行手机多了一个无线和蜂窝访问权限的选择。许多应用在第一次安装的时候会自动弹出一个alertview询问用户是否允许应用...
  • 背景 一直都有用户反馈无法正常联网的问题,经过定位,发现很大一部分用户是因为网络权限被系统关闭,经过资料搜集和排除发现根本原因是: ...对于第 1 种情况,出现在 iOS 10 比较多,一旦出现后系统设置里...
  • iOS 10下 ,首次进入应用时,会有询问是否允许网络连接权限的的弹窗,为更好进行用户交互,需要在打开应用时获取应用禁用网络权限状态(状态分为:未知、限制网络、未限制网络),客户端根据不同的权限状态定制...
  • iOS项目开发中,网络请求是必不可少的部分,大多数iOS开发者会使用第三方的网络请求框架AFNetworking。AFNetworking基本每个iOS开发者都知道,但是却很少有人去阅读过它的源码。都会用,但却不知道它的原理,可谓...
  • iOS 如何进行网络测速

    2018-01-25 21:48:41
    对于网络测速的需求还是比较常见的,比如常见的手机管家、360 Wi-Fi 等 App 都有网络测速的功能。近期由于业务需求也涉及到网络测速这块内容,同时自己好久没更新博客了,所以来写一下网络测速这块的一个简单总结。...
  • 在开发过程中,有时候需要对网络不好的情况做处理,就是要模拟多种网络环境。那么神器来了 NetworkLinkConditioner iPhone设备 可以在设置-开发者-NetworkLinkConditioner下 Status-Enable中进行设置,如图: ...
  • iOS 访问网络权限

    2016-10-12 13:53:19
    访问网络有可能出现错误提示 The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. 这是由于没有设置访问网络权限,对 info.plist进行如下...
  • 转自:http://blog.csdn.net/ztp800201/article/details/9305619
  • iOS开发 iOS10推送设置

    2017-01-10 10:49:34
    iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说。希望看完我的这篇文章,对大家有所帮助。Xcode简单适配相对简单的推送证书以及环境的问题,我就不在这里讲啦,我在这里说的,是指原有工程的...
1 2 3 4 5 ... 20
收藏数 116,797
精华内容 46,718
关键字:

10 ios 配置选择网络