当前位置: 首页 > 工具软件 > Reachability > 使用案例 >

Reachability使用简介

安高翰
2023-12-01

如果app中需要从网络获取数据,必要地一步就是确认网络环境,我们可以通过apple提供的Reachability来确认。

首先,将Reachability.h和Reachability.m这两个文件拷到工程中,然后导入SystemConfiguration.framework这个framework,接下来我们就可以使用了.我用的版本是2.2。相对于2.0精简了一些接口。

这个类提供了三种网络环境。

分别是

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

检测网络环境有主动探测和被动获取两种方式。

先介绍第一种,主动探测。

//reachabilityWithHostName- Use to check the reachability of a particular host name. 
+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;

//reachabilityWithAddress- Use to check the reachability of a particular IP address. 
+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;

这两个接口需要提供hostName或者hostAddress,比如说

    Reachability *reachability = [Reachability reachabilityWithHostName:@“www.apple.com”];
    switch ([reachability currentReachabilityStatus]) {
            case NotReachable:
                    // 没有网络连接
                    break;
            case ReachableViaWWAN:
                    // 使用3G网络
                    break;
            case ReachableViaWiFi:
                    // 使用WiFi网络
                    break;
    }
当然,个人觉得不推荐这种方式,万一你提供的这个地址宕机了呢,所以还是用下面这个接口

// Use to check whether the default route is available.  
// Should be used to, at minimum, establish network connectivity.
+ (Reachability *) reachabilityForInternetConnection;
这个还是比较靠谱的。

另外还有一个检测是否是wifi网络的接口:

//reachabilityForLocalWiFi- checks whether a local wifi connection is available.
+ (Reachability*) reachabilityForLocalWiFi;


然后是第二种,通过notification来获取网络状态,也就是实时获取。

在程序启动时,加上下面:

    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
    _internetReachable = [Reachability reachabilityForInternetConnection];
    [_internetReachable startNotifier];

然后实现

- (void)checkNetworkStatus:(NSNotification *)notice
{
    NetworkStatus internetStatus = [_internetReachable currentReachabilityStatus];
    if (internetStatus == NotReachable) {
        [self negativeWindow];
    }
}

在这个方法里也可以使用参数来做:

    Reachability* curReach = [note object];
    NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
    NetworkStatus status = [curReach currentReachabilityStatus];

OK, Done.

 类似资料: