iOS完美的网络状态判断工具

大多数App都严重依赖于网络,一款用户体验良好的的app是必须要考虑网络状态变化的.iOSSinger下一般使用Reachability这个类来检测网络的变化.

Reachability

这个是苹果开发文档里面的一个类,官方写的,用来判断网络的变化,包括无网络,wifi,和蜂窝三种情况.Reachability类实际上是苹果公司对SCNetworkReachability API的封装,使用方法比较简单,这里不再介绍.说说它的优缺点:

优点

使用简单,只有一个类,官方还有Demo,容易上手

灵敏度高,基本网络一有变化,基本马上就能判断出来

能够判断有网状态的切换比如2G/3G/4G切换

缺点

不能判断路由器本身是否能联网

能否连接到指定服务器,比如国内访问墙外的服务器

有网,但是信号很差,网速很慢,跟没网一样.这时候应该认为无网.

解决方案

事实上Reachability已经很好了,但是实际上客户端到达服务器需要很多道"关卡",例如路由器,电信服务器,防火墙等.其实说白了就是解决一个问题:客户端是否能够成功访问服务器.这里介绍另外一个官方的类:SimplePing点我查看

SimplePing

SimplePing也是官方文档的一个类,目的是ping服务器,可以判断客户端是否可以连接到指定服务器.ping 类似于心跳包功能,隔一段时间就ping下服务器,看是否畅通无阻.因此ping不可能做到及时判断网络变化,会有一定的延迟.可能大家已经猜到了我的思路,没错,把他们两个合在一起.下面说说我的思路:

首先利用Reachability判断设备是否联网,至于能不能连接到服务器用ping来检查

如果Reachability判断为有网,并且ping也判断为有网,那么表示真的有网,否则就是没网.

ping 虽然能够判断客户端到服务器是否畅通,但是由于网络抖动或者网络很弱等原因,可能出现ping失败的情况,解决方案就是加上失败次数限制,超过限制就认为断网了.

2/3/4G切换的时候,Reachability虽然检测到了网络变化,但是类型还是蜂窝移动,不能给出具体的网络类型.这里可以通过获取状态栏上的属性来判断.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

  - (SGNetworkStatus)netWorkDetailStatus{

    UIApplication *app = [UIApplication sharedApplication];

    UIView *statusBar = [app valueForKeyPath:@"statusBar"];

    UIView *foregroundView = [statusBar valueForKeyPath:@"foregroundView"];

    

    UIView *networkView = nil;

    

    for (UIView *childView in foregroundView.subviews) {

        if ([childView isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {

            networkView = childView;

        }

    }

    

    SGNetworkStatus status = SGNetworkStatusNone;

    

    if (networkView) {

        int netType = [[networkView valueForKeyPath:@"dataNetworkType"]intValue];

        switch (netType) {

            case 0:

                status = SGNetworkStatusNone;

                break;

            case 1://实际上是2G

                status = SGNetworkStatusUkonow;

                break;

            case 2:

                status = SGNetworkStatus3G;

                break;

            case 3:

                status = SGNetworkStatus4G;

                break;

            case 5:

                status = SGNetworkStatusWifi;

                break;

            default:

                status = SGNetworkStatusUkonow;

                break;

        }

    }

    return status;

}

可喜的是,即使隐藏了状态栏,判断依然有效!

其他细节

默认采用host为`www.baidu.com`,别喷我,不是给百度打广告,而是因为百度真的只适合判断有没有网,因为响应真的很快.当然也可以用自己的服务器地址,这样更加真实,万一你家的服务器很渣或者突然crash了也能够完美判断.

判断具体网络类型的时候,实际上用kvc获取了控件的私有属性,根据网上的反应,没有因此被拒的情况,因此不用担心.如果因为这个原因被拒,请联系我第一时间修改.

支持全局通知和代理的方式.默认全局发送通知,如果设置了‘delegate‘这个属性,那么只有代理会收到通知,不在发送全局通知.如果想两种方式并存,可以新建一个‘SGNetObserver‘对象.

PS:貌似苹果官方的原话是‘调用了系统的私有api会被拒‘.

支持模拟器,支持IPv4,IPv6

详细代码在这里:GitHub地址  支持cocoapods,欢迎使用!

时间: 2024-08-25 02:12:54

iOS完美的网络状态判断工具的相关文章

Android笔记之网络状态判断

1.首先当然得在 manifest 中添加检查网络状态的权限: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.INTERNET"/> 2.具体判断步骤 (1)首先要先获得Android 对连接管理的一

网络状态判断

- (IBAction)doNetButton:(id)sender { Reachability *hostReach=[Reachability reachabilityWithHostName:@"www.baidu.com"];//网络可达性 NetworkStatus status=[hostReach currentReachabilityStatus];  //网络状态 //判断网络状态 switch (status) { case NotReachable: NSLog

iOS中利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也分为2G/3G/4G等不同制式.而不同的网络制式又对用户体验产生 较为明显的影响(对于依赖网络的项目而言).因此很有必要对不同的网络制式作相应的优化. 而在iOS当中,无论是苹果官方提供的Reachability类还是较为常用的第三方网络类AFNetworking,它们提供的网络环境判断也仅限 于W

iOS开发-关于网络状态的判断

在判断网络状态这个问题上,苹果提供了一个叫Reachability的第三方库,但是这个库并不能真正的检测我们的网络状态,我也是在调试程序的时候发现的.详情可以阅读这个博客http://blog.csdn.net/openglnewbee/article/details/50705146 但是我并没有使用上面博客的方法,而是使用另外一种方法. 因为[Reachability reachabilityWithHostName:]完全没用,所以我把以下代码作为Reachablity类的成员函数添加到R

iOS模拟各种网络状态

在iOS开发中我们有在各种不同网络状态下测试app运行状态的需求.苹果给我们提供了在模拟器和真机状态下,模拟各种网络状态的软件. 在模拟器中 苹果提供的模拟网络状态的工具官网地址下载该工具需要登录Apple ID,根据需求选择不同的版本. 选择如图所示,点击Network Link Conditioner.prefPane运行 在系统偏好设置中出现了该工具的选项 不同选项对应的网络状态. Preset Profiles 预设网络状况 配置 说明 100%Loss 全丢包 3G 3G网络 DSL

利用CoreTelephony获取用户当前网络状态(判断2G,3G,4G)

前言: 在项目开发当中,往往需要利用网络.而用户的网络环境也需要我们开发者去注意,根据不同的网络状态作相应的优化,以提升用户体验. 但通常我们只会判断用户是在WIFI还是移动数据,而实际上,移动数据也分为2G/3G/4G等不同制式.而不同的网络制式又对用户体验产生 较为明显的影响(对于依赖网络的项目而言).因此很有必要对不同的网络制式作相应的优化. 而在iOS当中,无论是苹果官方提供的Reachability类还是较为常用的第三方网络类AFNetworking,它们提供的网络环境判断也仅限 于W

iOS开发 - 检测网络状态(WIFI、2G/3G/4G)

检测网络状态 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是 让用户了解自己的网络状态,防止一些误会(比如怪应用无能) 根据用户的网络状态进行智能处理,节省用户流量,提高用户体验 WIFI\3G网络:自动下载高清图片 低速网络:只下载缩略图 没有网络:只显示离线的缓存数据 苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态 https://developer.apple.com/library/ios/samplecode/Reachability/Rea

Android网络状态判断 wifi mobile

/** * 网络状态 wifi mobile * * @author jiangbing * */ public class NetworkUtils { /** * 判断当前是否 网络连接 (是否有效的连接)不分wifi mobile */ public static boolean isConnectdeAvailable(Context context) { try { ConnectivityManager manager = (ConnectivityManager) context

iOS系统设备网络抓包工具介绍:越狱和不越狱的办法

对终端进行抓包是客户端测试中的一种重要手段.本文主要介绍了ios设备(iphone.ipad和ipodtouch)的几种常用的抓包方法. 一.准备条件 需要进行抓包的设备必须经过root,俗称越狱,主要利用redsn0w和各种iOSFirmwares进行,如越狱不用更换固件版本,只需使用 redsn0w安装Cydia即可,网上有详细教程,此处省略.安装完毕,在3G或WiFi环境下启动Cydia,确认身份为“开发者”,如下图. 通过Cydia源,用户可以下载和安装比appstore更高权限的软件,