2012-06-15 4 views
3

Для нашего приложения мы используем следующий код для проверки подключения к Интернету, когда пользователь приложения пытается отправить сообщение. Когда мы тестируем эту функцию, она отлично работает при включении режима самолета. Затем, когда мы выключаем режим самолета, вызов подключенного устройства все еще возвращает NO. Что может быть причиной этого? Нужна ли нам дополнительная «настройка» в порядке, чтобы все было правильно? например, прослушивать уведомления об изменении состояния сети?iOS Тест на повышение производительности

+ (BOOL)connected 
{ 
    Reachability *hostReach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];  
    return !(netStatus == NotReachable); 
} 

ответ

1

Вы должны просто попытаться подключиться к сети, а не использовать для этого. NSURLConnection приведет к запуску радиостанций. Однако не забудьте обработать ошибки, если это произойдет.

0

Вы используете какой-то конструктор удобства для проверки доступности - это не сработает.

Один из лучших примеров того, как использовать достижимости находится здесь на SO:

https://stackoverflow.com/a/3597085/653513

Или так, что предлагает Эрикс и не использовать достижимости вообще - это жизнеспособный вариант.

+0

Мы нашли много тайм-аутов в нашем коде, когда мы назвали Reachability в основном потоке. Это произойдет при определенных плохих сетевых условиях. Итак, теперь мы называем это только фоновыми потоками и используем его только для уведомлений о «сети, пришедших», а не «доступном в сети». – EricS

+0

Вы не должны _call_ Достижимость. Вы настроили его и прослушали его уведомления. –

2

Инженеры Apple предложили полностью полагаться на возможность повторного использования.

С SO post (источник BLOCKQUOTE)

On a WWDC talk this year the Apple engineer on stage recommended users to never base 
the application internet access on the Reachability example app status. Often  
reachability doesn't provide a complete information (it is based on a complex mechanism)  
and the suggestion provided by the engineer was this: 

1. try to do your internet connection, whatever it is the Reachability status; 
    then set your UI hint based on success/fail result 
2. if it fails due to networking issue, then register to Reachability and retry again 
    when Reachability gives the green light; this is needed when you want to recover 
    automatically from the fail condition 
3. in any case give the user the possibility to "force a retry", whatever is the 
    Reachability status. If it succeeds, reset your UI hint immediately. 

Что я сделал?

Каждый раз, когда мне нужно сделать соединение, например

NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString 
       stringWithFormat:@"http://myadress.com"]]]; 
[self performSelectorOnMainThread:@selector(responseHandler:) 
         withObject:data waitUntilDone:TRUE]; 


- (void)responseHandler:(NSData *)responseData { 
    if(!responseData) { 
     ReachabilityController *reachability = [[ReachabilityController alloc] init]; 
     [reachability checkReachability]; 
     return; 
    } 
    // you handle your data 
} 

Что происходит Eсть, достижимость будет проверяться только если соединение было не удалось. Я сделал общий механизм ReachabilityController, который касается только достижимости. Я сделал это так, чтобы я мог совершать вызовы со всех остальных контроллеров каждый раз, когда я делаю запрос.

Мой ReachabilityController.m выглядит

-(void) checkReachability { 
    Reachability* internetAvailable = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [internetAvailable currentReachabilityStatus]; 
    NSString *messageText; 
    if (netStatus == NotReachable) 
    { 
     messageText = [NSString stringWithFormat:@"Internet access not available"]; 
    } 
    else 
    { 
      Reachability *netReach = [Reachability reachabilityWithHostName:host]; 
      NetworkStatus hostStatus = [netReach currentReachabilityStatus]; 
      if (hostStatus == NotReachable) 
      { 
       messageText = [NSString stringWithFormat:@"Host Unreachable"]; 

      } 
      else 
      { 
       messageText = [NSString stringWithFormat:@"Problem with remote service"]; 
      } 

    } 
    NSLog(@"%@", messageText); 
} 

Это не приведет к сбою приложения, как вы регулируете данные «нулевые» параметра себя и, наконец, вы определить причину.

надеюсь, что это поможет!

UPDATE:

Apple, может отклонить ваше приложение, если вы покажете ложное сообщение о Интернет-соединениях. Они очень серьезно относятся к своей репутации с iphone. Если подключение к Интернету доступно, но если ваше приложение сообщит, что доступ к интернету недоступен, Это будет считаться очень серьезным

Смежные вопросы