在测试苹果官方提供的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,欢迎互相交流。