Тест доступности iOS

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

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

person tom    schedule 15.06.2012    source источник


Ответы (3)


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

Из сообщения SO (источник цитаты )

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
}

То, что там происходит, достижимость будет проверена только в том случае, если соединение не удалось. Я сделал общий 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);   
}

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

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

ОБНОВИТЬ:

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

person Kishor Kundan    schedule 02.10.2012

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

person EricS    schedule 15.06.2012

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

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

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

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

person Rok Jarc    schedule 15.06.2012
comment
Мы обнаружили много сбоев тайм-аута в нашем коде, когда вызывали Reachability в основном потоке. Это произойдет при определенных плохих условиях сети. Итак, теперь мы вызываем его только в фоновых потоках и используем его только для сетевых уведомлений, а не для тестирования доступности сети. - person EricS; 16.06.2012
comment
Вы не должны вызывать Reachability. Вы настраиваете его и слушаете его уведомления. - person Rok Jarc; 16.06.2012