Возможная ошибка в 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);
}
Другие вопросы по тегам