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,欢迎互相交流。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,617评论 7 249
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,180评论 19 139
  • 故事的情节不必多说,想必您或者已经看了不止一遍的同名电影还有这本小说。 一个坐冤狱的银行家凭借自己的努力,成功地从...
    老李读书阅读 282评论 0 2
  • 各種打不開: 郵箱打不開,新聞打不開,App Store 打不開。請問正確的打不開方式? 回憶倒是可以打開,但還是...
    Quercus阅读 288评论 0 1
  • 不奢求参与你的现在,只盼望相逢不在病榻间。
    夏薪阅读 212评论 0 0