2014-01-02 5 views
1

У меня есть простой 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-адресом?

Спасибо!

ответ

8

У достижимости есть некоторые проблемы. Если вы подключены к Wi-Fi, он будет возвращать его, но он не будет пинговать хост. Лучше всего было бы использовать NSURLCONNECTION пинговать сервер непосредственно

+ (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; 
} 
+0

Спасибо! Будет ли это работать и с адресами? Кроме того, что, если я пытаюсь выполнить ping-порт без HTTP? – Carpetfizz

+1

Мы используем его с Google и IP-адресом, поэтому я знаю, что обе эти работы –

+0

Спасибо, но ваш пример обрабатывает только HTTP-запросы/ответы. Что делать, если я хочу выполнить ping протокол FTP или SSH? Разве статусные коды и т. Д. Не будут отличаться? – Carpetfizz

1

Я думаю, что это происходит потому, что внутренние флаги достижимости длинные номера. Поэтому, когда вы проходите 8170319837018, [_checkStatus currentReachabilityStatus] должно возвращать некоторое число, которое не равно NotReachable (0), и поэтому оно должно возвращать TRUE. Вместо этого вы можете проверить каждый тип достижимости, как показано ниже:

-(BOOL)checkConnectionForHost:(NSString*)host{ 
    _checkStatus = [Reachability reachabilityWithHostname:host]; 
    NetworkStatus networkStatus = [_checkStatus currentReachabilityStatus]; 
    return (networkStatus == ReachableViaWiFi) || (networkStatus == ReachableViaWWAN); 
} 
Смежные вопросы