可达性返回不准确状态

时间:2014-01-02 21:53:35

标签: ios iphone objective-c reachability

我有一个简单的Reachability代码,如果我可以连接到服务器则会返回:

-(BOOL)checkConnectionForHost:(NSString*)host{
   _checkStatus = [Reachability reachabilityWithHostname:host];
   NetworkStatus networkStatus = [_checkStatus currentReachabilityStatus];
   return networkStatus != NotReachable;
}

我通过添加google.com之类的内容对其进行了测试,但效果很好。但是,如果我键入像8170319837018这样的垃圾编号,并调用此函数,它仍会返回TRUE。但是,如果我向其添加任何字符,例如8170319837018a,它将返回FALSE,就像它应该的那样。我在Reachability上调用了错误的方法吗?我是否必须检查字符串是URL还是IP地址?

谢谢!

2 个答案:

答案 0 :(得分:8)

可达性有一些问题。如果您连接到wifi,它将返回它的可重新生成但实际上并不ping主机。更好的方法是使用NSURLCONNECTION直接ping服务器

+ (BOOL)pingURL:(NSString *)url
{
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:1];
    NSURLResponse *response = nil;
    NSError *error = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"response %d", [(NSHTTPURLResponse *)response statusCode]);
    if ([(NSHTTPURLResponse *)response statusCode] == 200) {
        return YES;
    }

    return NO;
}

答案 1 :(得分:1)

我认为这是因为内部可达性标志是长数字。因此,当您传递8170319837018时,[_ checkStatus currentReachabilityStatus]必须返回一些不等于NotReachable(0)的数字,这就是它必须返回TRUE的原因。你可以做的是检查每种类型的可达性,如下所示:

-(BOOL)checkConnectionForHost:(NSString*)host{
   _checkStatus = [Reachability reachabilityWithHostname:host];
   NetworkStatus networkStatus = [_checkStatus currentReachabilityStatus];
   return (networkStatus == ReachableViaWiFi) || (networkStatus == ReachableViaWWAN);
}