2g网络环境不能进入 ios

2016-11-10 15:07:19 yan325098 阅读数 8276

以前iOS9上只有蜂窝访问权限,不过默认都是允许访问,可以自行去设置里面关闭。

而iOS10针对国行手机多了一个无线和蜂窝访问权限的选择。许多应用在第一次安装的时候会自动弹出一个alertview询问用户是否允许应用使用包括无线和蜂窝的数据。但也有部分是不会弹出的(iOS10系统bug,解决办法可自行百度)。注意这个弹窗只会在该手机第一个安装该应用的时候才会弹出,卸载重装也不会弹,类似keychain机制。

所以为了防止用户在第一次弹窗的时候点了不允许而后面不能正常连接网络的情况,做出了相应的处理。(由于苹果并没有给出相应的api,无法获知用户在第一次是否点了允许还是不允许,所以通过间接的方式去判断,有误判,不过都是极少情况的概率出现)

所有因为我们应用有引导页,所以在引导处自己写了一个请求百度HEAD的方法(为了去弹出系统网络弹窗,如果没有请求不会弹出,写HEAD请求也是为了节省流量)。然后在过渡到登陆页面的时候用AF去判断当前的网络状态,如果是AFNetworkReachabilityStatusNotReachable,即表示当前网络不可用。

然后在对此情况做出两种判断:

wifi:

- (NSDictionary *)fetchSSIDInfo {

    NSArray *ifs = (__bridge_transfer NSArray *)CNCopySupportedInterfaces();

    if (!ifs) {

        return nil;

    }


    NSDictionary *info = nil;

    for (NSString *ifnam in ifs) {

        info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);

        if (info && [info count]) { break; }

    }

    return info;

}

如果获取到的info不为nil,则当前是wifi情况下没有网络连接。


蜂窝:

获取运营商信息

- (NSString *)fetchMobileInfo {

    CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo allocinit];

    return  info.currentRadioAccessTechnology;

}

可以去判断是否为2G,2G情况下我是直接排除判断范围,因为2G环境下有可能会出现发生了网络请求,但是系统没有弹窗。

然后用了一个ios9的api去判断当前设置的蜂窝允许状态:(用户第一次弹窗选择了不允许,是指蜂窝和无线都不允许,那么可以通过这个蜂窝的状态间接去判断)

- (void)startValidateNetworkAuthorization:(NetworkAuthorizationStatus)block {

    CTCellularData *cellularData = [[CTCellularData alloc]init];

    cellularData.cellularDataRestrictionDidUpdateNotifier =  ^(CTCellularDataRestrictedState state){

        //获取联网状态

        block(state);

        switch (state) {

            case kCTCellularDataRestricted:

                CDLogDebug(@"Restricrted");

                break;

            case kCTCellularDataNotRestricted:

                CDLogDebug(@"Not Restricted");

                break;

            case kCTCellularDataRestrictedStateUnknown:

                CDLogDebug(@"Unknown");

                break;

            default:

                break;

        };

    };

}


通过上面的判断最后可以得出在wifi情况下/蜂窝非2G情况下到登陆页面无网络连接,并且蜂窝状态是被拒绝的状态,就这样得出用户在第一次弹窗的时候点了不允许。
判断条件是iOS10以上,然后再通过keychain保存了一个值,只在第一次安装的时候才去判断,其他时候不用管。

存在误判情况:
1、完全无网模式下进入应用,包括关闭wifi、蜂窝,或者是直接飞行模式进入,当然这种情况下比较少。
2、有wifi但是wifi是不能联网的,也是比较少见。
所以通过这种方式可以减少误判范围,最主要的原因苹果只针对国行才有这个权限,没有给出相应的api。

有一种方式可以判断是否是飞行模式下进入应用:

- (void)checkNetworkConnectTest {

    // 创建零地址,0.0.0.0的地址表示查询本机的网络连接状态

    struct sockaddr_in zeroAddress;//sockaddr_in是与sockaddr等价的数据结构

    bzero(&zeroAddress, sizeof(zeroAddress));

    zeroAddress.sin_len = sizeof(zeroAddress);

    zeroAddress.sin_family = AF_INET;//sin_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族


    /**

     *  SCNetworkReachabilityRef: 用来保存创建测试连接返回的引用

     *

     *  SCNetworkReachabilityCreateWithAddress: 根据传入的地址测试连接.

     *  第一个参数可以为NULLkCFAllocatorDefault

     *  第二个参数为需要测试连接的IP地址,当为0.0.0.0时则可以查询本机的网络连接状态.

     *  同时返回一个引用必须在用完后释放.

     *  PS: SCNetworkReachabilityCreateWithName: 这个是根据传入的网址测试连接,

     *  第二个参数比如为"www.apple.com",其他和上一个一样.

     *

     *  SCNetworkReachabilityGetFlags: 这个函数用来获得测试连接的状态,

     *  第一个参数为之前建立的测试连接的引用,

     *  第二个参数用来保存获得的状态,

     *  如果能获得状态则返回TRUE,否则返回FALSE

     *

     */

    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); //创建测试连接的引用:

    SCNetworkReachabilityFlags flags;


    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);

    CFRelease(defaultRouteReachability);

    if (didRetrieveFlags && flags == 0) {

        //当前是没有打开网络情况进入,不应该获取网络权限之后弹窗

        CDLogDebug(@"%u",flags);

    }

}

如果获取到的flags是0,就是相当于关闭蜂窝和无线,或者飞行模式进入,在这里我没有用,毕竟觉得占少数可以不用去考虑。

2016-07-16 16:47:21 yzzst 阅读数 10006

APP弱网络条件下,体验优化之道

最近跟朋友聊天刚好聊到这一块,他们是在做电商业务,商品图片及其多,API接口请求频率也高。然而,他们在移动2/3G的网络环境下,APP经常会出现Loading很久的情况,这里我把我们所分析与使用到的网络优化方案与大家分享一下。

所谓的弱网络,也就是指在网络不好的条件下进行使用APP,如2G、3G网络,这类网络条件下,用户的网络速度基本维持在10K/S~60K/S。如此差的网络环境, 如果还希望给用户提供良好的用户体验,那么我们的APP就该想想如何优化了。

转载表明来源:http://blog.csdn.net/yzzst/article/details/51764909

到底慢在哪里?

需要处理在弱网络下的加载速度,那么我们要先确定一下我们的整个APP在哪个地方加载的速度如何,最长的加载路径在哪里,我们从而才有针对性的进行优化与修改。

Webview

如果是对是APP中内嵌的webview网页,针对网页体验优化已经由来已久了。我们可以使用Chrome的开发者模式,调整到Network模式下,将网络条件设置为3G去请求网页,那么我们就能够看出来一个网页加载的速度主要都好费在哪个地方,如下图所示:

当然,html的加速方式有很多种

  • 使用gulp\grunt进行打包压缩:js\css资源压缩,雪碧图合并等。
  • 使用font-awesome替换图片:字体可以很好的兼容,无限放大,常用的图片都有

APP API

当然很多情况下使我们的接口设计得不够合理,多次请求一个相同数据 or 慢查询造成的。我们也可以使用chrome://inspect插件,查看自己的device请求情况(Android 手机连接上adb)。如下图所示:


接口设计优化

接口的优化理论上不属于APP弱网络的优化,但是这个的API性能的问题,确实在网络条件不好的情况下才暴露无遗。大家都在谈论服务器的好坏,设备的性能高低,其实,对于一个良好的Server来说,绝大部分拖延请求速度的地方都是在IO上。包括,磁盘读写的IO,SQL查询的IO等等。

常用的优化点:

1 . 慢查询监控
MySQL是支持慢查询日志监控的,我们能够在日志中准确的看出那一条记录的查询读写时间。具体操作大家可以查看:http://www.tuicool.com/articles/nmmimae

2 . 多次查询优化
尽量避免在For循环里面进行SQL查询!!!这个是我们最近被外包坑的心得。能够构造出一两句通过SQL查询的语句就尽量不要在代码里面处理,也不需要进行多次查询。

3 . 常用接口cache
这个cache的机制我不多说了,各式各样的cache框架,直接避免了与SQL打交道。个人觉得是不得已而为之,对于实时性要求过高的接口,还是不能采取。


图片优化

说到网络优化,绝大部分都是对图片的优化。

可以购买CDN了

CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN
的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。

公司里面使用的是阿里云的CDN服务

CDN说是可以使用最近的网络节点提供服务,避免网络传输中的消耗,但是真正的试验后我们会发现,CDN的优化毕竟有限,并不能起到体验质的飞跃。

换一个更快的图片格式webp

WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。Facebook

但WebP是一种有损压缩。相较编码JPEG文件,编码同样质量的WebP文件需要占用更多的计算资源。

WebP的图片格式介绍我自己也早有耳闻,但是却没有真正的使用过。

说的再多不如我们自己手动实验一下,能够压缩多少。我们尝试将系统自带的企鹅的图片进行转化,得到如下两张图片对比:

图片从原来的760k直接变成了121k,大小仅仅为原图的 六分之一,(⊙o⊙)!!!!不敢相信。

分别打开两张图片作对比,虽然说webp是失真压缩,我们在对比查看的时候如果没有很仔细的看,确实看不出来两图的区别。细节上webp确实存在一点瑕疵,但是想到1/6的压缩,这一点点瑕疵已经无所谓了。

不同网络的不同图片下发

图片的格式更换了,我们在想想图片的精度、图片的尺寸是否也能够按照不同的情况下做下发呢?

如(对于原图是600X480的图片):

  • 2/3G使用低清晰度图片——>下发300X240,精度为80的图片
  • 4G普通清晰度图片——>下发600X480,精度为80的图片
  • WiFi高清晰度图片(最好根据网速来判断,wifi也有慢的)——>下发600X480,精度为100的图片

我们同样的实验了一下,得到的结果如下所示:

理论上,在网络条件不怎么好的情况下,我们能够适应情况的降低图片的大小,从而加快整个APP的加载速度。

配合七牛使用不同的图片格式

Ok,可能很多朋友会跟我说,我艹,这么复杂的处理,不同尺寸、不同精度、不同格式的图片,我们得怎么存?我们是否每次产品方上传产品的时候都需要对图片处理,那么图床的压力得多大啊。有没有成套的解决方案?

答案是有的, 也就是我公司现在所采用的解决方案。七牛云存储(我不是广告,真心好用):

七牛云存储为企业提供图片云存储、音频云存储、视频云存储等非结构化静态文件的高速稳定安全云存储平台,快速拥有专属文件服务集群,七牛云存储用户免费享有CDN特权。

对于我们的研发来说,它们所提供的图片处理功能缺失不错。

如,我们可以在自己的仓库中设置需要处理的图片类型,如下图所示:

选择需要产生的不同图片格式,尺寸,精度模板。模板生成后,我们根据模板的内容就会得到一个参数,如下所示:

imageView2/1/w/640/h/300/format/webp/interlace/0/q/100

怎么使用呢?

如,我们在七牛上存储了一个我们自己的图片,得到的图片外链为:

http://7xujx4.com1.z0.glb.clouddn.com/o_1ank7b5fsm56af1js61g1e7js7.jpg

image

当然,这个图片是存储的是原图。

这个时候我们处于不同的网络条件下,希望更换尺寸、格式到上述描述的条件,我们只需要在连接上加上参数

http://7xujx4.com1.z0.glb.clouddn.com/o_1ank7b5fsm56af1js61g1e7js7.jpg?imageView2/1/w/640/h/300/format/webp/interlace/0/q/100

image

就将原图转化为宽度640,高度300,格式为webp,精度为100的图片了。(⊙o⊙)!!!!!


让用户感觉到快

网络条件不好的条件下,我们做再多的优化也是如同治标不治本,很难达到与WiFi环境下一样的体验。既然,网络请求、缓存、压缩的方案都采取了,那么你可以想一下,是否是自己的交互,让用户感觉到卡顿、慢?

具体怎么让用户感到快,针对不同种类的APP操作不一样,这里我举几个例子:

  1. 不从0开始的进度条
    如下图所示,不管网页的加载进度如何,不管网络条件如何,uc浏览器的加载进度始终是从50%起,并且停留在大约98%进度左右的地方。给予用户一种,网页马上就要加载完了的感觉。

  2. 先显示文字在加载图片
    同样是在Webview之中,图片或者多媒体的加载速度肯定是远远慢过文字的加载速度的。由于不同的webview显示和渲染效果不同,我们可以先让webview先显示文字,在显示图片。给用户一种可以先预览整个网页概况的感觉。
    即:

//本身含义阻止图片网络数据
webSettings.setBlockNetworkImage(true);

// 网页载入完成后,将阻塞的图片加载放开。

//解除数据阻止
webSettings.setBlockNetworkImage(false);

当然,如果是在非webview中,为了避免网络资源的消耗,也可以模仿类似的操作。

3 . 常用信息加入缓存机制、增量更新
对于APP来说,没有网络就不可用是一个硬伤,如果客户端的业务与整个公司的业务对时效性要求没有这么强烈。那么,我们是可以做到一些缓存的机制的。

如,对于今日头条APP来说,如下图所示,它们首页新闻列表,每次进入都是先从缓存中拿去出来的。每一次的刷新取得的数据,都是与服务端所推送的数据的差值(增量更新),而不是整个listview刷新。

/*
* @author zhoushengtao(周圣韬)
* @since 2016年7月16日 下午16:47:20
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
/

2011-12-27 19:15:57 duanyipeng 阅读数 1545
iOS5完美越狱箭在弦上 很快就会发布

  泡泡网平板电脑频道12月20日 用千呼万唤始出来形容iOS5绝对不算夸张,距离iOS5发布两个多月的时间中,有关iOS5完美越狱的消息无时无刻不牵动着成千上万果粉的心。虽然我们等得异常辛苦,但是漫长的等待终于有了回报,也让我们看到了iOS5完美越狱的曙光。



  近日,著名越狱开发者pod2g在其个人网络日志中公布了有关iOS5完美越狱的最新进展。他表示,旧款设备完美越狱已进入最后的测试阶段,他目前正在修复系统稳定性以及相关问题,还需要数天的时间。而这里所指的旧款设备便是指iPhone4、iPhone 3GS、第一代iPad、iPod Touch3及iPod Touch4,当然,他也表示搭载A5处理器的全新设备iPhone4S以及iPad2也已经开始着手研究,一有最新进展便会第一时间通知大家,看来完美越狱的日子离我们不远了。


  


  iOS相比Android开发者 谁挣得钱更多

  在很多朋友眼里,因为iOS平台上一部分的应用软件会收取费用,而Android相对消费者下载是免费的,而直观的认为iOS所获得的收益更高,曾经有一篇调查文章中称,Android的开发者所获得的收益仅占苹果iOS的开发者所获收益的7%,然而一切真的是这样吗?



  其实不然,iOS上的点击率为Anroid的两倍还要多,但每一千个人的成本却仅比Android高30%,从这点我们也能看出Android开发者可以从点击率中获取更高的收益。同时,Android能产生的广告曝光宣传次数是iOS的两倍,在广告收益上Android同样略胜一筹。由于苹果打造了一个相对 闭的生态环境,而Android的环境开放许多,开发者可以在其上使用额外广告附加手段,这或许意味着Android平台的开发者会赚的更多。


  


  圣诞平板大战iPad 王 Nook更受女生青睐

  话说圣诞节就快到了,大家是否已经计划好这个圣诞节该怎么过了呢?随着节日气氛的逐渐浓厚,你是否有购买平板电脑的想法呢?一家名为Meltwater Group的组织近期发布了一项他们的研究调查报告,结果显示,在假期中最受关注的平板电脑仍然是王者iPad,而紧随其后的便是被女生们讨论最多的Kindle Fire和Nook Tablet。





  我们了解到,之所以Nook Tablet和Kindle Fire能够获得女生们的热情讨论,可能是这两款平板相对电子书资源更为丰富,另一方面则是源于两款产品在广告宣传中的形象定位。前阵子黑色星期五,Kinlde Fire不也才刚刚打败iPad夺得销售冠军吗?


  


  Kindle Fire严重影响iPad销量 导致市场份额下降

  Kindle Fire这个iPad杀手的名字可真是名不虚传啊!据外媒报道,虽然iPad在近期的黑色星期五购物季以及即将到来的圣诞节销量依然抢眼,但是由于Kindle Fire的绝地反击,iPad市场份额惨遭蚕食,被打压后的第四季度市场份额已滑落至59%,早前iPad在第三季度共占据61.5%的平板电脑市场。



根据市场研究公司IDC预计,第三季度Android平板在市场占有份额下降了0.8%,但是由于第四季度Kindle Fire的强劲销量,势必会带动Android平板市场份额超过40%。IDC分析师珍妮弗表示:“不断改进的Android体验,更低的价格有助于提升Andorid在全球市场所占有的份额”。


  


  三星转战美国 建厂专门为苹果生产A5芯片

  据可靠消息称,三星正打算在美国德克萨斯州的奥斯丁建设一座工厂,而建设工厂的目的主要是为了帮助苹果生产用于iPhone4S以及iPad2上的A5芯片。据了解,该工厂共占地160万平方英尺,三星共斥资36亿美元建立了这条非存储芯片生产线,本月初与即将达到最大产能。



这座工厂几乎把生产的所有非存储芯片都奉献给了苹果,当然,三星也会在这里生产NAND闪存芯片,对此三星和苹果方面都不予以置评。看来三星即使和苹果在专利方面闹得不可开交,但是亦敌亦友的企业相互成长关系仍然无法摆脱。


  乔布斯传记作者欲推出再版 增补乔布斯去世前后内容

  据著名杂志《财富》网络版报道,《史蒂夫·乔布斯传》的作者沃特·艾萨克森预计将填补该书。他声称这本书有望将内容扩充到630页以上,其中一种方案是添加大量的注释,而另外一种则是通过补充版来添加我们的教主去世前后的内容。



  艾萨克森认为,乔布斯这位科技巨匠的故事几十年甚至百年后都会得到颂扬。而乔布斯对于这本传记唯一采取干预的就是书的 面设计,如果乔布斯不能决定自己传记的 面设计,那么他也就会终止与艾萨克森的合作。同时,艾萨克森还表示,即将改版推出的乔布斯传也绝不是最终版,它仅仅可能是第二稿。来源泡泡网)

载自:http://roll.sohu.com/20111220/n329605716.shtml

2016-04-09 09:34:21 magical_code 阅读数 559

1.Reachability简介

Reachability是一个在iOS系统环境下检测iOS设备当前的网络环境的库。它的主要功能是监测三种网络环境:2G/3G/4G、WiFi网络、无网络。在应用的运行状态下,实时监测网络连接方式的变更,及时给出通知。

2.Reachability的使用

首先需要在GitHub上下载Reachability的压缩包,解压后将Reachability.h和Reachability.m文件拖入工程当中,在使用的地方引入头文件即可。

49F78937-87CC-4483-90FD-4DDD1C44801D

直接获取当前网络环境:

  1. //可以使用多种方式初始化
  2. Reachability *reach = [Reachability reachabilityWithHostName:@"www.hcios.com"];
  3. //判断当前的网络状态
  4. switch ([reach currentReachabilityStatus]) {
  5. case ReachableViaWWAN:
  6. NSLog(@"正在使用移动数据网络");
  7. break;
  8. case ReachableViaWiFi:
  9. NSLog(@"正在使用WiFi");
  10. break;
  11. default:
  12. NSLog(@"无网络");
  13. break;
  14. }

根据currentReachabilityStatus方法获取当前的网络环境,ReachableViaWWAN表示移动数据网络,ReachableViaWiFi表示WiFi网络,NotReachable表示没有接入网络。

通知的方式获取当前网络环境:

  1. //可以使用多种方式初始化
  2. Reachability *reach = [Reachability reachabilityWithHostName:@"www.hcios.com"];
  3. //通知中心注册通知
  4. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
  5. //Reachability实例调用startNotifier方法启动网络状态监测
  6. [reach startNotifier];
  1. //收到通知调用的方法
  2. - (void)reachabilityChanged:(NSNotification *)notification {
  3. Reachability *reach = [notification object];
  4. //判断网络状态
  5. if (![reach isReachable]) {
  6. NSLog(@"网络连接不可用");
  7. } else {
  8. if ([reach currentReachabilityStatus] == ReachableViaWiFi) {
  9. NSLog(@"正在使用WiFi");
  10. } else if ([reach currentReachabilityStatus] == ReachableViaWWAN) {
  11. NSLog(@"正在使用移动数据");
  12. }
  13. }
  14. }

通过通知的方式使用Reachability是在程序中经常使用的,Reachability可以在用户的网络状态发生改变时,及时给出通知提醒,防止数据流量的快速流失,在实际的项目应用中是十分常见的。

2014-02-25 18:01:25 qijianli 阅读数 13866

公司在做一个项目,需要区分网络类型。Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网。网上也有些方法,却都存在Bug。经过两次的网上查找资料和测试,基本上又三种方法,以下将一一介绍并解析不足。

typedef enum {

    NetWorkType_None = 0,

    NetWorkType_WIFI,

    NetWorkType_2G,

    NetWorkType_3G,

} NetWorkType;


1、使用导航栏的方式:(私有API)

代码:

UIApplication *application = [UIApplication sharedApplication];

    NSArray *subviews = [[[application valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];

    NSNumber *dataNetWorkItemView = nil;

    for (id subView in subviews) {

        if ([subView isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {

            dataNetWorkItemView = subView;

            break;

        }

    }

    NetWorkType networkType = NetWorkType_None;

    switch ([[dataNetWorkItemView valueForKey:@"dataNetworkType"]integerValue]) {

        case 0:

            NSLog(@"No wifi or cellular");

            networkType = NetWorkType_None;

            break;

            

        case 1:

            NSLog(@"2G");

            networkType = NetWorkType_2G;

            break;

            

        case 2:

            NSLog(@"3G");

            networkType = NetWorkType_3G;

            break;  

            

        default:           

NSLog(@"Wifi");

            networkType = NetWorkType_WIFI;

            break;

    }

    return networkType;


使用这种方法要确保导航栏没有被隐藏,如果导航栏被隐藏则取不到值。另外,该方法存在Bug,通过Reachability类,在网络类型发生改变时,再执行该代码,获取的网络类型数据没有更新。如果程序进入后台再转到前台,重新执行该代码时,便可以重新获取最新的网络类型数据。这样用户体验不好,当用户在移动中,网络类型发生改变,无法获取最新的网络类型,则页面数据无法更新。(PS:如果哪位大神知道,有什么方法可以刷新数据值,望不吝赐教,感谢!)


2、通过SCNetworkReachability类

代码:

struct sockaddr_in zeroAddress;

    bzero(&zeroAddress, sizeof(zeroAddress));

    zeroAddress.sin_len = sizeof(zeroAddress);

    zeroAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); //创建测试连接的引用:

    SCNetworkReachabilityFlags flags;

    SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);

if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)  

    {

        return NetWorkType_None;   

    }

    NetWorkType retVal = NetWorkType_None;

    if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)

    {

        retVal = NetWorkType_WIFI;

    }

    if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||    

         (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))

    {

        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)  

        {

      retVal = NetWorkType_WIFI;    

        }

    }

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)

    {

        if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {

            if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {

                retVal = NetWorkType_3G;

                if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {

                    retVal = NetWorkType_2G;

                }

            }

        }

    }

    return retVal;


这种方法跟Reachability的方法相同,也无法区分2G网和3g网,但是网上有人测试可以区分,如果有人知道原因,希望指正,谢谢!


3、使用SoftwareUpdateService.framework(私有API)

准备工作:

导出生成私有API的头文件声明
使用私有或未公开的API,首先需要导出其对应的头文件,在头文件里有相关函数的声明。
工具:
class-dump
class-dump可以从编译后的Objective-C的二进制文件中提取对应的数据结构及函数等声明。
使用方法:
为了能在任意目录下使用class-dump命令,首先建议把class-dump文件拷贝到/user/local/bin/目录下,然后就可以在任意目录下执行以下命令:
class-dump /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/System/Library/Frameworks/SoftwareUpdateServices.framework/ >SUKit.h

但是bulidsetting 设置framework的search path 时要设置真实的私有库路径,因为我们要用它的可执行文件,只有头文件是不行的。

代码:

NSBundle *b =  [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/SoftwareUpdateServices.framework"];

    if ([b load]) {

        // load Class from STRING

      SUNetworkMonitor *networkMonitor = [SUNetworkMonitor sharedInstance];

        int netType = [networkMonitor currentNetworkType];

        NetWorkType networkType = NetWorkType_None;

        switch ( netType ) {

            case 0:

                NSLog(@"No wifi or cellular");

                networkType = NetWorkType_None;

                break;

            case 1:

                NSLog(@"WIFI");

                networkType = NetWorkType_WIFI;

                break;

            case 2:

                NSLog(@"2G");

                networkType = NetWorkType_2G;

                break;                

            case 3:

                NSLog(@"3G");

                networkType = NetWorkType_3G;

                break;

            default:

                break;

        }

        return networkType;

    }

    return NetWorkType_None;


这种方法可以获取网络类型,并且在网络类型改变时,获取最新的网络类型。目前还没有发现Bug,只是准备阶段的工作比较麻烦。


4、最后一种方法,就是利用IOS7系统自带的API获取。只是,IOS7以下的系统版本需要上述的方法获取网络类型。


IOS越狱学习总结

阅读数 1040