iOS Reachability在Wifi下检测有问题

在测试苹果官方提供的Reachability时发现,使用:

Reachability* reach=[ReachabilityreachabilityWithHostName:url];

如果当前正连接至wifi状态,会导致reach.currentReachabilityStatus始终是ReachableViaWiFi,不论url链接是否是一个可以访问的域名,经研究发现,这个是苹果写该函数时的机制导致的,在WIFI状态下不论能不能连接到该HostName,都将返回ReachableViaWiFi,因此不能使用该函数来鉴别能否ping通。当然有许多别的库来支持实现该功能,例如aftnetworking等,笔者这里仅分享一个最简单的原生ping通测试方法:


-(void)pingHost:(NSString*)url{

// 设置请求路径

NSURL*urlString = [NSURLURLWithString:url];

// 创建请求对象

NSURLRequest*urlRequest = [NSURLRequestrequestWithURL:urlStringcachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:1];

// 创建会话对象

NSURLSession*urlSession = [NSURLSessionsharedSession];

// 发送请求

NSURLSessionDataTask*urlSessionDataTask = [urlSessiondataTaskWithRequest:urlRequest

completionHandler:^(NSData*_Nullabledata,

NSURLResponse*_Nullableresponse,

NSError*_Nullableerror) {

// 处理从服务器下载的数据

if(error ==nil&& data !=nil) {

dispatch_async(dispatch_get_main_queue(), ^{

[selfcheckNetwork:YES];

});

}

else{

dispatch_async(dispatch_get_main_queue(), ^{

[selfcheckNetwork:NO];

});

}

}];

// 执行任务

[urlSessionDataTaskresume];

}



-(void)checkNetwork:(BOOL)ping{

Reachability* reach=[ReachabilityreachabilityWithHostName:urlInTxf];
//[reach startNotifier];需要监听再打开

switch(reach.currentReachabilityStatus) {

caseNotReachable:

if(!ping)

[selfshowAlert:@"无网络"];

else

[selfshowAlert:@"错误:能ping通 但无网络"];

break;

caseReachableViaWiFi:

if(!ping)

[selfshowAlert:@"有wifi,但无法连接上host"];

else

[selfshowAlert:@"有wifi,可以连接上host"];

caseReachableViaWWAN:

if(!ping)

[selfshowAlert:@"有wwan,但无法连接上host"];

else

[selfshowAlert:@"有wwan,可以连接上host"];

default:

break;

}

}



-(void)showAlert:(NSString*) msg{

UIAlertController* alertCtl=[UIAlertControlleralertControllerWithTitle:@"alert"message:msgpreferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* alertAction=[UIAlertActionactionWithTitle:@"确定"style:UIAlertActionStyleDefaulthandler:^(UIAlertAction*_Nonnullaction) {

}];

[alertCtladdAction:alertAction];

[selfpresentViewController:alertCtlanimated:YEScompletion:nil];

}

调用pingHost:即可完成ping通测试,以上便是简单的Ping方法分享,若有错误烦请大家指出,本人刚接触iOS,欢迎互相交流。

你可能感兴趣的:(iOS Reachability在Wifi下检测有问题)