码迷,mamicode.com
首页 > 移动开发 > 详细

ios网络判断的方式

时间:2015-09-18 18:55:01      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:nsclassfromstring   reachability   statusbar   

        对于ios判断网络连通方式我总结了一下几种方法:

1、Reachability。

        Reachability是苹果推荐的用来判断当前网络状态的第三方库。Reachability使用的主要函数包括:

+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;

+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;

+ (Reachability*) reachabilityForInternetConnection;

+ (Reachability*) reachabilityForLocalWiFi;

通过以上函数初始化一个Reachability实例,然后调用

- (NetworkStatus) currentReachabilityStatus;

返回枚举类型NetworkStatus,即可获得网络连通方式,其中

typedef enum {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN,
    ReachableVia2G,
    ReachableVia3G,
    ReachableVia4G,
} NetworkStatus;

2、connectedToNetWork(from 网络)

        第二种方式来源于网上,且只能判断网络是否连通而无法确定具体的连通方式,作为Reachablity类的成员函数添加到Reachability类里的,代码如下:

+ (BOOL)connectedToNetWork {
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    if (!didRetrieveFlags) {
        printf("Error. Count not recover network reachability flags\n");
        return NO;
    }
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    return (isReachable && !needsConnection) ? YES : NO;
}

3、statusBar+connectedToNetWork(私有API,可能会被AppStore拒掉,慎用)

        第二种方式因为是定义为类函数,所以使用起来比较方便,但是会有延时,也就是说如果用户关掉wifi开关和流量开关然后立马进行网络判断,那么这个函数依旧会返回YES,延时大约有2~3s。所以第三中方式通过将statusBar和connectedToNetWork结合来提高网络连通性判断的准确性。依旧是作为Reachability的一个类函数,代码如下:

+ (BOOL)isNetworkAvailable{
    //step1:调用类方法connectedToNetWork判断网络连通情况
    BOOL connected_1=[Reachability connectedToNetWork];
    
    //step2:通过statusBar上的网络图标来判断网络连通情况
    BOOL connected_2=YES;
    UIApplication *app=[UIApplication sharedApplication];
    if(app.statusBarHidden==NO){
        NSNumber *networkType=nil;
        NSArray *subViewOfStatusBar=[[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
        for(id child in subViewOfStatusBar){
            if([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]){
                //1-2G;2-3G;5-wifi
                networkType=[child valueForKeyPath:@"dataNetworkType"];
                break;
            }
        }
        if(networkType == nil){
            connected_2=NO;
        }
    }
    return (connected_1 && connected_2);
}

说明:断网情况下,即statusBar上没有网络图标(wifi、2G、3G或4G),那么statusBar的foregroundView的subview里是没有UIStatusBarDataNetworkItemView的,这样一来,networkType的值就会为一开始赋值的nil,而不会像网上说的为0。

        


本文出自 “Layne的学习园地” 博客,请务必保留此出处http://laynestone.blog.51cto.com/9459455/1695995

ios网络判断的方式

标签:nsclassfromstring   reachability   statusbar   

原文地址:http://laynestone.blog.51cto.com/9459455/1695995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!