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

序言php

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

1.如今很流行的公用wifi,须要网页鉴权,鉴权以前没法上网,但本地链接已经创建;ios

2.存在了本地网络链接,但信号不好,实际没法链接到服务器;git

3.iOS链接的路由设备自己没有链接外网。程序员

CocoaChina上已有不少网友对此进行提问和吐槽,好比:github

苹果的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
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:

咱们在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喔!

问啊-一键呼叫程序员答题神器,牛人一对一服务,开发者编程必备官方网站:www.wenaaa.com

QQ群290551701 汇集不少互联网精英,技术总监,架构师,项目经理!开源技术研究,欢迎业内人士,大牛及新手有志于从事IT行业人员进入!

相关文章
相关标签/搜索