Неверный ответ - достижимость для 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;
}
}
У меня есть пара запросов:
- Это может звучать странно, но что-то не так с аппаратным обеспечением или iOS, что это ReachableViaWWAN, даже если в устройстве нет SIM-карты?
- Есть ли лучшее решение (чем обходной путь, упомянутый выше) для этой проблемы?
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.
}
Он отлично работает для меня.