Возможная ошибка в CFNetDiagnosticCopyNetworkStatusPassively? Возврат kCFNetDiagnosticConnectionDown только через 3G/4G.
Здесь есть странная ошибка. Это проявляется только в том случае, если устройство iOS используется исключительно в сетях 3G/4G. т.е. если по WiFi - ошибки нет и все работает нормально.
- ( BOOL ) isInternetAccessAvailable
{
CFNetDiagnosticRef diag;
diag = CFNetDiagnosticCreateWithURL ( NULL, ( __bridge CFURLRef )[NSURL URLWithString:@"www.apple.com"] );
CFNetDiagnosticStatus status;
status = CFNetDiagnosticCopyNetworkStatusPassively ( diag, NULL );
CFRelease ( diag );
if ( status == kCFNetDiagnosticConnectionUp )
{
return YES;
}
else
{
NSString * title = @"No Internet Connection";
NSString * message = @"Please ensure you have an Internet Connection.";
[self showAlertWithTitle:title andMessage:message];
return NO;
}
}
Итак, у меня есть вышеупомянутый метод, который вызывается, прежде чем я пытаюсь загрузить данные в UIWebView.
Как я уже сказал - через сеть WiFi это работает отлично.
Если WiFi выключен (или недоступен / не подключен) и устройство использует SIM-карту для сетей 3G/4G.
линия где звонки:
status = CFNetDiagnosticCopyNetworkStatusPassively ( diag, NULL );
возвращает длинный эквивалент:
kCFNetDiagnosticConnectionDown
Поэтому мой тест не пройден, и я отображаю предупреждение UIAlertView для пользователя.
Но сеть есть! Если я изменю тестовую строку на это:
if ( ( status == kCFNetDiagnosticConnectionUp ) || ( status == kCFNetDiagnosticConnectionDown ) )
Он работает через 3G/4G и загружает веб-страницу, поэтому устройство или сеть не виноваты.
Но призыв к CFNetDiagnosticCopyNetworkStatusPassively
не работает только на 3G/4G.
Есть идеи?
Это было только что найдено в приложении, которое я недавно отправил в App Store, чтобы уложиться в сроки для рекламы и мерчендайзинга, и если в моем коде есть ошибка - мне нужно это исправить и повторно отправить как можно скорее.
2 ответа
Подтвержденная ошибка Apple.
Дупе, если хотите: идентификатор ошибки # 12443370
Вы можете использовать это, чтобы проверить связь
Как проверить активное интернет-соединение на iOS или OSX?,
Ответ cannyboyn для синхронной версии: Возьмите Reachability.h и Reachability.m в https://github.com/tonymillion/Reachability
#import "Reachability.h"
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}