Неверный ответ - достижимость для WWAN

При проверке доступности (доступности сети) iPAD 3 WiFi+Cellular я столкнулся со странной проблемой, которая произошла в приведенном ниже сценарии.

  • Чтобы проверить доступность сети, я использовал пример кода Apple для доступности.
  • Следующий код был реализован для проверки доступности WiFi или WWAN.

`

- (BOOL)networkCheck
 {
    Reachability *wifiReach = [Reachability reachabilityForInternetConnection];
    NetworkStatus netStatus = [wifiReach currentReachabilityStatus];

    switch (netStatus)
    {
        case NotReachable:
        {
            NSLog(@"%@",@"NETWORKCHECK: Not Connected");    
            return false;
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"%@",@"NETWORKCHECK: Connected Via WiFi");       
            return true;
            break;
        } 
        case ReachableViaWWAN:
        {
            NSLog(@"%@",@"NETWORKCHECK: Connected Via WWAN");
            return true;
            break;
        }
    }
    return false;
 }

`

  • В сценарии, когда в iPAD не было SIM-карты, а также отсутствовало соединение Wi-Fi, вышеупомянутый метод выполняет случай ReachableViaWWAN, который выглядит совершенно неверным, так как нет SIM-карты или любой другой доступной сети WWAN.

Чтобы преодолеть эту проблему, было предложено и реализовано обходное решение (или, если можно так сказать, взломать) следующим образом: Отправить запрос на надежный хост и проверить его ответ.

case ReachableViaWWAN:
    {
        NSLog(@"%@",@"NETWORKCHECK: Connected Via WWAN");
        NSData *responseData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"www.google.com"]] returningResponse:nil error:nil];
        if (responseData != nil)
        {
            return true;
            break;
        }
        else
        {
            return false;
            break;
        }

    }

У меня есть пара запросов:

  1. Это может звучать странно, но что-то не так с аппаратным обеспечением или iOS, что это ReachableViaWWAN, даже если в устройстве нет SIM-карты?
  2. Есть ли лучшее решение (чем обходной путь, упомянутый выше) для этой проблемы?

1 ответ

Я не знаю, является ли это ошибкой в ​​вашем коде, но вы можете попробовать использовать это для проверки соединения. из этого вопроса.

и для проверки возможности подключения вы можете создать такой метод:

 -(BOOL)connected
  {
     Reachability *reachability = [Reachability reachabilityForInternetConnection];
     NetworkStatus networkStatus = [reachability currentReachabilityStatus];
     return !(networkStatus == NotReachable);
 }

и где вы хотите проверить соединение просто

if (![self connected]) {
//THERE IS NO WWAN OR WIFI connection
}else{
// connected. 
}

Он отлично работает для меня.

Другие вопросы по тегам