阿里云服务器免费领卷啦。

捡代码论坛-最全的游戏源码下载技术网站!

 找回密码
 立 即 注 册

QQ登录

只需一步,快速开始

搜索
关于源码区的附件失效或欺骗帖, 处理办法
查看: 1857|回复: 0

iOS下的实际网络连接状态检测

[复制链接]

4208

主题

210

回帖

12万

积分

管理员

管理员

Rank: 9Rank: 9Rank: 9

积分
126159
QQ
发表于 2016-12-19 18:30:18 | 显示全部楼层 |阅读模式
41.jpg
作者:管振纬

序言

网络连接状态检测对于我们的iOS app开发来说是一个非常通用的需求。为了更好的用户体验,我们会在无网络时展现本地或者缓存的内容,并对用户进行合适的提示。对绝大部分iOS开发者来说,从苹果示例代码改变而来的各种Reachablity框架是实现这个需求的普遍选择,比如这个库。但事实上,基于此方案的所有实现,都无法帮助我们检测真正的网络连接状态,它们能检测的只是本地连接状态;这种情况包括但不限于如下场景:

1.现在很流行的公用wifi,需要网页鉴权,鉴权之前无法上网,但本地连接已经建立;

2.存在了本地网络连接,但信号很差,实际无法连接到服务器;

3.iOS连接的路由设备本身没有连接外网。

CocoaChina上已有很多网友对此进行提问和吐槽,比如:

如何判断设备是否真正连上互联网?而不是只有网络连接
[Reachability reachabilityWithHostName:]完全没用!
苹果的Reachability示例中有如下说明,告诉我们其能力受限于此:

"Reachability cannot tell your application if you can connect to a particular host, only that an interface is available that might allow a connection, and whether that interface is the WWAN."

而苹果的SCNetworkReachability API则告诉了我们更多: "Reachability does not guarantee that the data packet will actually be received by the host. "

Reachability相关的框架在底层都是通过SCNetworkReachability来实现网络检测的,所以无法检测实际网络连接情况。

有鉴于此,笔者希望打造一个通用、简单、可靠的实际网络连接状态检测框架,于是RealReachability诞生了。

RealReachability简单介绍

RealReachability是笔者1个月之前发布到github的开源库,项目地址如下: https://github.com/dustturtle/RealReachability。 短短1个月时间收获了100多个star,其中主要来自于外国友人,最近还上了github的OC板块趋势排行榜,着实令笔者相当惊喜。 此框架开发的初衷来源于项目实际需求,离线模式对网络连接状态的要求比较苛刻,且实际场景经常会遇到“伪连接”的情况,Reachability面对此场景力不从心。多方研究后引入了ping能力(此方案流量开销最小,也最简单),实现了简单的实际网络连接监测;后面经过提炼和优化,就有了这个框架。可以告诉大家的是,这个框架在appstore上架应用中已经经受了考验,且经过了长时间的测试,可以放心使用。

集成和使用介绍

集成
最简便的集成方法当属pod: pod 'RealReachability'。

手动集成:将RealReachability文件夹加入到工程即可。

依赖:Xcode5.0+,支持ARC, iOS6+.项目需要引入SystemConfiguration.framework.

使用介绍
其接口的设计和调用方法和Reachability非常相似,大家可以无缝上手,非常方便。 开启网络监听:


  1.    [GLobalRealReachability startNotifier];
  2.     [[NSNotificationCenter defaultCenter] addObserver:self
  3.                                              selector:@selector(networkChanged:)
  4.                                                  name:kRealReachabilityChangedNotification
  5.                                                object:nil];
复制代码




回调代码示例:


  1. - (void)networkChanged:(NSNotification *)notification
  2. {
  3.     RealReachability *reachability = (RealReachability *)notification.object;
  4.     ReachabilityStatus status = [reachability currentReachabilityStatus];
  5.     NSLog(@"currentStatus:%@",@(status));
  6. }
复制代码





触发实时网络状态查询代码示例:

  1. [GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) {
  2.         switch (status)
  3.         {
  4.             case NotReachable:
  5.             {
  6.             //  case NotReachable handler
  7.                 break;
  8.             }
  9.             
  10.             case ReachableViaWiFi:
  11.             {
  12.             //  case ReachableViaWiFi handler
  13.                 break;
  14.             }
  15.             
  16.             case ReachableViaWWAN:
  17.             {
  18.             //  case ReachableViaWWAN handler
  19.                 break;
  20.             }
  21.             default:
  22.                 break;
  23.         }
  24.     }];
复制代码



查询当前实际网络连接状态:

1
ReachabilityStatus status = [reachability currentReachabilityStatus];
Demo:

我们在github的repository中已经包含了简单的Demo工程,直接下载运行即可。相关的Api调用也可以参考demo中的实现。 demo截图:

45.png

RealReachability的实现原理

RealReachability架构图:

111.png

realReachability架构概要图RealReachability主要包含3大模块:connection、ping、FSM; 其中Ping模块通过对同样是苹果提供的ping样例代码进行了封装,connection模块实现了基于SCNetworkReachability的本地状态检测,FSM模块是有限状态机。通过FSM的状态管理控制connection模块和Ping模块协同工作,并通过可配置的定时策略等业务逻辑优化,最终得到了我们的实现。

PS:其中connection模块和ping模块也可独立使用,分别提供本地网络检测和ping的能力,感兴趣的读者也可以尝试(调用方式请参考RealReachability开源代码)。

结束语

希望这个框架能够帮助到大家的iOS开发! 遇到任何疑问或者使用上的问题,都可以联系我。

对此框架我也会持续进行维护和优化,更希望感兴趣的朋友可以到github上pull request! 开源有你更精彩! https://github.com/dustturtle/RealReachability 觉得有用就点个star喔!



http://www.cocoachina.com/ios/20160224/15407.html
http://www.jianshu.com/p/bf0bb29b12cd

捡代码论坛-最全的游戏源码下载技术网站! - 论坛版权郑重声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与捡代码论坛-最全的游戏源码下载技术网站!享有帖子相关版权
3、捡代码论坛版权,详细了解请点击。
4、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。
5、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。 我们不承担任何技术及版权问题,且不对任何资源负法律责任。
6、如无法链接失效或侵犯版权,请给我们来信:jiandaima@foxmail.com

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立 即 注 册

本版积分规则

技术支持
在线咨询
QQ咨询
3351529868

QQ|手机版|小黑屋|捡代码论坛-专业源码分享下载 ( 陕ICP备15015195号-1|网站地图

GMT+8, 2024-4-20 14:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表