Достижимость - Лучшая практика перед показом webView

Я хотел бы проверить «достижимость» до / когда веб-представление отображается в моем приложении.

До сих пор я включал файлы reachbility.h / .m, а также добавил SystemConfiguration.framework в проект.

И это то, где заканчиваются соглашения, которые я нашел в интернете, по всем постам, блогам и т. Д. И т. Д., У каждого свое мнение / мнение о том, что делать после этого. Кроме того, я нашел много частичных фрагментов кода, которые на самом деле не являются полным решением, какие методы достижимости вызывать и т. Д. И т. Д., Как их использовать и т. Д.

Я также обнаружил, что некоторые предупреждают, что вы должны попытаться восстановить соединение, прежде чем проверять достижимость ... но я не нашел консенсуса или полного решения. Мое приложение, кажется, переподключается к Wi-Fi без какого-либо дополнительного кода ... так что я немного запутался и здесь ...

Любая помощь для очистки мутной воды будет принята с благодарностью. Я просто ищу простое простое решение.

Ответ принят: Я хотел бы отметить новичкам, которые могут прочитать этот вопрос позже ... что вы захотите сделать следующее:

Добавьте это в ваш .h файл:

- (BOOL) connectedToNetwork: (NSString *) remoteServer;
- (void) appLoadError: (NSString *) altertTitle alertMessage: (NSString *) altertMsg;

И вам нужно будет импортировать их в верхней части вашего файла .m:

SYS / socket.h

netinet / in.h

netinet6 / in6.h

арпа / inet.h

ifaddrs.h

netdb.h

SystemConfiguration / SystemConfiguration.h

Поправьте меня, если это не так ... Мне кажется, что это нормально работает ...

Ответы на вопрос(2)

NSURLConnection на каждый звонок (внизу,testConnection).

Вы можете использовать

+ (NSURLConnection *)connectionWithRequest:
        (NSURLRequest *)request delegate:(id)delegate

вместо.

Решение Вопроса

когда мне требуется доступ в Интернет. Я настроил его для разных типов доступа с течением времени, и он мне хорошо послужил. Это вариант одного из многих методов, которые вы можете найти после быстрого поиска в Google по этой теме.

Сложно и быстро придумать жесткую и быструю стратегию. Сама платформа предлагает различные варианты подключения, которые имеют свои плюсы и минусы в зависимости от потребностей каждого конкретного приложения. Метод, который я использую ниже, является просто общим тестом подключения, означающим, что устройство может подключиться к Интернету через некоторый механизм подключения

- (BOOL) connectedToNetwork: (NSString *) remoteServer {
    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags){
        NSLog(@"Error. Could not recover network reachability flags");
        return NO;
    }

    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;

    NSURL *testURL = [NSURL URLWithString: remoteServer];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];

    return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

Я обычно называю это внутри applicationDidFinishLaunching. Если проверка возвращает false, я обычно генерирую сообщение об ошибке (см. Ниже). Это связано с тем, что Apple запрещает выход из приложения любым другим способом, кроме кнопки «Домой» на устройстве.

...
else if(![self connectedToNetwork: [NSString stringWithFormat: @"http://%@:%@/", sharedSettings.server, sharedSettings.port]]){
        [self appLoadError: @"No Internet Detected" alertMessage:@"This application requires an active Internet connection.  No content is available."];        
}
...
- (void) appLoadError: (NSString *) altertTitle alertMessage: (NSString *) altertMsg {
    UIAlertView *loadErr = [[UIAlertView alloc] initWithTitle: altertTitle message: altertMsg delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil];
    [loadErr show];
    [loadErr release];

    // Load static screen
    UIImage *image = [UIImage imageNamed:@"Error_NoInternet.png"];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    [controller setNavigationBarHidden: YES animated: NO];

    [window addSubview: imageView];
    [imageView release];
}
 saman0104 сент. 2011 г., 01:22
sharedSettings и контроллер помечают ошибки. У вас есть идеи, что может отсутствовать?
 MystikSpiral04 сент. 2011 г., 17:34
Общие параметры - это экземпляр класса для хранения общих параметров, а Controller - это основной View Viewler вашего приложения, вам может потребоваться изменить имя переменной в соответствии с вашим приложением.

Ваш ответ на вопрос