如果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;
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;
在程序启动时,加上下面:
[[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.