美文网首页
iOS Reachability在Wifi下检测有问题

iOS Reachability在Wifi下检测有问题

作者: cowill | 来源:发表于2017-06-30 14:46 被阅读0次

    在测试苹果官方提供的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下检测有问题

          本文链接:https://www.haomeiwen.com/subject/orticxtx.html