首页 > 其他分享 >iOS开发之检测网络链接的实际状态RealReachability

iOS开发之检测网络链接的实际状态RealReachability

时间:2022-11-28 17:07:42浏览次数:59  
标签:case RealReachability iOS Reachability connection 模块 ping 链接


之前写的项目用了苹果自带的Reachability文件进行网络状态判断,发现判断情况并不是很理想,所以为了解决这个问题,查找了一些资料,来改变旧的判断方式,使用的是一个很好用的、封装好的第三方:RealReachability,下面就简单介绍一下,希望对大家有所帮助。


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

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

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

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

​苹果的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简单介绍

多方研究后引入了ping能力(此方案流量开销最小,也最简单),实现了简单的实际网络连接监测;后面经过提炼和优化,就有了这个框架。可以告诉大家的是,这个框架在appstore上架应用中已经经受了考验,且经过了长时间的测试,可以放心使用。

集成和使用介绍

  • 集成

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

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

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

  • 使用介绍

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

1


2


3


4


5


​[GLobalRealReachability startNotifier];​


​[[NSNotificationCenter defaultCenter] addObserver:self​


​selector:@selector(networkChanged:)​


​name:kRealReachabilityChangedNotification​


​object:nil];​


回调代码示例:

1


2


3


4


5


6


​- (void)networkChanged:(NSNotification *)notification​


​{​


​RealReachability *reachability = (RealReachability *)notification.object;​


​ReachabilityStatus status = [reachability currentReachabilityStatus];​


​NSLog(@​​ ​​"currentStatus:%@"​​ ​​,@(status));​


​}​


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

1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


​[GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) {​


​switch​​  ​​(status)​


​{​


​case​​  ​​NotReachable:​


​{​


​//  case NotReachable handler​


​break​​ ​​;​


​}​


 


​case​​  ​​ReachableViaWiFi:​


​{​


​//  case ReachableViaWiFi handler​


​break​​ ​​;​


​}​


 


​case​​  ​​ReachableViaWWAN:​


​{​


​//  case ReachableViaWWAN handler​


​break​​ ​​;​


​}​


​default​​ ​​:​


​break​​ ​​;​


​}​


​}];​


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

1


​ReachabilityStatus status = [reachability currentReachabilityStatus];​


Demo:

iOS开发之检测网络链接的实际状态RealReachability_ios开发

RealReachability的实现原理

RealReachability架构图:

iOS开发之检测网络链接的实际状态RealReachability_Reachability_02

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

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


源码链接: ​​https://github.com/dustturtle/RealReachability​


标签:case,RealReachability,iOS,Reachability,connection,模块,ping,链接
From: https://blog.51cto.com/u_15894905/5892237

相关文章

  • iOS开发之好用的图片选择第三方TZImagePickerController
    最近的项目中涉及到了类似于发布朋友圈的功能,其中就需要上传照片等媒体内容,所以为了方便和效果好看,使用了TZImagePickerController第三方来管理和调用媒体内容,现在就是简单......
  • iOS开发之利用web表单上传媒体资源(照片/视频)
    之前公司的Java工程师比较厉害,所以我在前端上传一个通过编码的NSString或者NSData类型的数据,就可以上传成功,现在因为此Java工程师没做过,所以为了实现类似于发布照片或小视频......
  • iOS开发之使用block块进行数据遍历的方法
    看了一篇文章,发现遍历数组、字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法。首先是......
  • iOS开发之自定义ActionSheet视图
    有时我们需要用到actionSheet来展示,但是但是往往系统的界面显示很丑或者并不符合UI的要求,所以在这里自定义一个,方便以后使用,后续有时间写一下Swift的开发。自定义ActionShee......
  • iOS模仿京东商城中的选择地区样式
    在ViewController文件中创建添加地址界面:@property(nonatomic,strong)UILabel*selectAreaLabel;//地区显示@property(nonatomic,strong)UITextField*nameTextF;//收货人......
  • IOS中的数据存储方式,特点,使用情况
    数据存储的核心都是写文件,主要有四种持久化方式:属性列表(Plist),对象序列化,SQLite数据库,CoreData。存储Plist:     键值进行存储,不能存储对象。对象需要序列化编码才能......
  • iOS开发之样式多样好用的滑动视图Demo
    现在App基本上都有滑动式图的展示,尤其是新闻资讯类的用到的最多,今天就给大家展示一个多样的滑动视图样式;首先可以看到,这是几种不同的搭配模式,也可以根据style进行其他样式的......
  • iOS开发之可双向调节的Slider滑块
    滑块在很多地方都有使用,所以这里向大家展示一个自定义的可双向控制的Slider,并且可以通过代理方法获取相应的范围值,部分代码如下:属性值:/** 设置最小值 */@property(nonato......
  • iOS开发之最近的小知识点总结一
    1、NSInteger打印以及字符串的转换2、UIScrollView在iOS7中使用了Autolayout导致不能滚动3、APP包瘦身4、interactivepopgesturerecognizer使用5、UICollectionView的数......
  • iOS开发之模仿语音聊天时,显示的音量图
    因为项目中有涉及到语音的内容,所以在这里实现一下说话时语音的音量图的展示具体内容查看代码,有注释语音内容的工具类:staticidinstance;#pragmamark-单例+(instancetyp......