登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

查看: 153|回复: 6

iOS下的实际网络连接状态检测:RealReachability,ios状态栏素材

[复制链接]

275

主题

512

帖子

2375

金钱

手工艺人

发表于 2018-1-8 10:43:48 | 显示全部楼层 |阅读模式

        序言

        网络连接状态检测对于我们的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是笔者2个月之前发布到github的开源库,目前有1000多个star,200多个fork,几经修改完善后,当前pod版本为1.1.2。
项目地址如下:
https://github.com/dustturtle/RealReachability。
此框架开发的初衷来源于项目实际需求,离线模式对网络连接状态的要求比较苛刻,且实际场景经常会遇到“伪连接”的情况,Reachability面对此场景力不从心。多方研究后引入了ping能力(此方案流量开销最小,也最简单),实现了简单的实际网络连接监测;后面经过提炼和优化,就有了这个框架。可以告诉大家的是,这个框架在appstore上架应用中已经经受了考验,目前也不断完善中,追求稳定的朋友可以使用最新的pod版本(修复了已知的绝大部分问题,参考demo的使用方式即可)。


集成和使用介绍
集成
最简便的集成方法当属pod: pod ‘RealReachability’。 手动集成:将RealReachability文件夹加入到工程即可。 依赖:Xcode5.0+,支持ARC, iOS6+.项目需要引入SystemConfiguration.framework.
使用介绍

        其接口的设计和调用方法和Reachability非常相似,大家可以无缝上手,非常方便。
开启网络监听(建议在didFinishLaunchingWithOptions中进行监听):

[Java] 查看源文件 复制代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [GLobalRealReachability startNotifier];
    return YES;
}

监听网络变化通知:
[Java] 查看源文件 复制代码
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(networkChanged:)
                                                 name:kRealReachabilityChangedNotification
                                               object:nil];

通知回调代码示例:
[Java] 查看源文件 复制代码
- (void)networkChanged:(NSNotification *)notification
{
    RealReachability *reachability = (RealReachability *)notification.object;
    ReachabilityStatus status = [reachability currentReachabilityStatus];
    NSLog(@"currentStatus:%@",@(status));
}

触发实时网络状态查询代码示例:
[Java] 查看源文件 复制代码
[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;
        }
    }];

查询当前实际网络连接状态:
[Java] 查看源文件 复制代码
ReachabilityStatus status = [reachability currentReachabilityStatus];

设置ping检测用的host服务器地址(可选):

        注意:这里你需要确保该服务器支持ping操作。不设置的情况下我们默认使用baidu.com作为ping服务器。
可以使用自己的服务器,或者使用稳定、可靠的网络地址(比如百度、qq等)。设置示例如下:

[Java] 查看源文件 复制代码
GLobalRealReachability.hostForPing = @"www.baidu.com";

获取当前的数据网络连接类型(高级功能):
[Java] 查看源文件 复制代码
 WWANAccessType accessType = [GLobalRealReachability currentWWANtype];

        该类型可以被用来优化应用程序的体验,比如不同的网络类型下设置不同的网络超时时间等,关于此方面的优化方案,可以参考携程给出的分享:https://www.infoq.com/cn/articles/how-ctrip-improves-app-networking-performance


Demo:

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


RealReachability的实现原理
RealReachability架构图:

        

0

主题

7071

帖子

-521

金钱

限制会员

发表于 2018-1-8 16:40:02 | 显示全部楼层
帮帮顶顶!!

20

主题

7100

帖子

2375

金钱

手工艺人

发表于 2018-1-8 17:14:19 | 显示全部楼层
mark,收藏了

14

主题

7077

帖子

1467

金钱

手工艺人

发表于 2018-1-8 18:06:16 | 显示全部楼层
code4app好的内容真的很多~赞

20

主题

7128

帖子

2337

金钱

手工艺人

发表于 2018-1-8 19:32:59 | 显示全部楼层
小弟学习了~支持,支持

16

主题

7122

帖子

1166

金钱

手工艺人

发表于 2018-1-8 21:17:43 | 显示全部楼层
好好 学习了 确实不错

23

主题

7098

帖子

1054

金钱

iOS大神

Rank: 6Rank: 6

分享大神

发表于 2018-1-9 00:48:48 | 显示全部楼层
小弟学习了~支持,支持
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

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