李洪强ios下的实际网络连接状态检测

李洪强 李洪强     2022-07-31     727

关键词:

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

 

 


 

序言

 

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

 

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

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

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

 

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

 

 

苹果的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非常相似,大家可以无缝上手,非常方便。 开启网络监听:

 

 

[GLobalRealReachability startNotifier];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(networkChanged:)
                                                 name:kRealReachabilityChangedNotification
                                               object:nil];

 

回调代码示例:

 

- (void)networkChanged:(NSNotification *)notification
{
    RealReachability *reachability = (RealReachability *)notification.object;
    ReachabilityStatus status = [reachability currentReachabilityStatus];
    NSLog(@"currentStatus:%@",@(status));
}

 

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

 

 

[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;
        }
    }];

 

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

 

ReachabilityStatus status = [reachability currentReachabilityStatus];

 

Demo:

 

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

技术分享

RealReachability的实现原理

 

RealReachability架构图:

技术分享

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

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

 

结束语

 

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

李洪强ios开发之添加手势

李洪强iOS开发之添加手势02-添加手势  查看详情

李洪强ios开发之下载

   // // // LHQDownLoader.m // A21-李洪强-下载 // // Createdbyvicfanon16/7/3. // Copyright©2016年李洪强.Allrightsreserved. // &nb 查看详情

李洪强漫谈ios开发[c语言-044]-翻译数字

 李洪强漫谈iOS开发[C语言-044]-翻译数字  查看详情

李洪强ios开发之计算数组的最大最小值

//// ViewController.m// A21-李洪强-输出参数//// Createdbyvicfanon16/7/3.// Copyright©2016年李洪强.Allrightsreserved.////   计算数组的最大最小值 #import"ViewController.h" @ 查看详情

李洪强ios开发之苹果使用预览截图

 李洪强iOS开发之苹果使用预览截图01在预览的图片中选中你要截得区域  02-command+C 03-Command+N 04-Command+S(保存)    查看详情

李洪强漫谈ios开发[c语言-043]-判断较早日期

李洪强漫谈iOS开发[C语言-043]-判断较早日期  查看详情

李洪强ios开发之程序设计语言

  李洪强iOS开发之程序设计语言 printf是打印的意思-格式化输出f:format格式化       C语言编译器 编译器的功能就是将高级语言的源代码,翻译成机器可以识别的二进制文件就是可执行文件----... 查看详情

李洪强ios开发之动态获取uilabel的bounds

 李洪强iOS开发之动态获取UILabel的bounds在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法。  1.获取宽度,获取字符串不折行单行显示时所需要的长度   CGSizelabelBounds=[strsizeWithFon... 查看详情

李洪强ios开发之创建一个对象并访问实例变量

//// main.m// 07-创建一个对象并且访问实例变量//// Createdbyvicfanon16/7/3.// Copyright©2016年李洪强.Allrightsreserved.//  //Car*car=[Carnew];类名*指针=[类名new];[Carnew];做了三件事:1向计算机申请内存空间2初 查看详情

李洪强ios开发之oc无参方法的声明实现和调用

  查看详情

李洪强ios开发之有参方法的声明实现和调用

    //// main.m// 09-有参方法的声明实现和调用//// Createdbyvicfanon16/7/5.// Copyright©2016年李洪强.Allrightsreserved.///** * C语言函数 * intsum(inta,intb) 查看详情

李洪强ios开发之类的声明和实现

 类的声明和实现 类是一类具有相同特征和共同行为的集合小轿车 大卡车 挖掘机  (车) 车类类名:Car属性:颜色 速度 轮字数共同行为:跑 停 载人 对象:是类的具体的实体车:BYDBMW时风 ... 查看详情

李洪强-类和对象

  查看详情

李洪强ios面试一般性问题

iOS面试一般性问题,学会这些拿offer几率提升90%!  面试题中有一些一般性的问题,通常是会问到的。面试iOS应聘者时,切入点很重要,不同的切入点会导致不同的结果,没有找到合适的切入点也无法对应聘者有一个全面... 查看详情

李洪强ios开发之大神必备的xcode插件

 iOS开发大神必备的Xcode插件写在前面工欲善其事,必先利其器,iOS开发中不仅要学会Xcode的基本操作,而且还得学会一些Xcode的使用技巧,如掌握常用的快捷键等,还有就是今天要说到的Xcode插件,下面我就为大家介绍几款开... 查看详情

李洪强ios开发之oc语言前期准备

OC语言前期准备 一、OC简介Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码。可以使用OC开发mac osx平台和ios平台的应用程序。拓展名:c语言-.c  OC... 查看详情

李洪强ios开发之oc语言基础知识

OC语言基础知识一、面向对象OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能的类。术语... 查看详情

李洪强ios开发之c语言程序编译过程

 汇编语言 指令用特定的名字来标记,这就是汇编语言人比较容易看懂汇编语言汇编直接和程序一一对应的有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言      程序编译过程命... 查看详情