Когда я должен проверить подключение к Интернету

Моему приложению для iPhone требуется интернет для работы.

Должен ли я проверять подключение каждый раз, когда выполняется интернет-функция? Или я должен использовать свой appDelegate для прослушивания сообщений от чего-то вроде класса доступности, чтобы определить, было ли соединение потеряно, и предупредить пользователя?

Что лучше?

Вот что я сделал до сих пор в своем делегате приложения:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];  

    reachability = [[Reachability reachabilityWithHostName:[NSString stringWithFormat:@"http://%@/iSql/" ,[[NSUserDefaults standardUserDefaults] stringForKey:@"serviceIPAddress"]]] retain];

    [reachability startNotifier];

    return YES;
}

- (void)reachabilityChanged:(NSNotification *)note {

    NetworkStatus ns = [(Reachability *)[note object] currentReachabilityStatus];

    if (ns == NotReachable) {

        if (![networkAlert isVisible]) {

            if ([self networkAlert] == nil) {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"\n\nNo Internet Connection" message:@"You require an internet connection to retrieve data from the server." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
                [self setNetworkAlert:alert];
                [alert release];
            }

            [networkAlert show];  
        }
    } else {

        if ([self networkAlert] != nil) {
            [networkAlert dismissWithClickedButtonIndex:0 animated:YES]; 
        }

    }
}

person Hackmodford    schedule 28.12.2011    source источник


Ответы (4)


По крайней мере, один ведущий Apple tech talk рекомендовал не проверять доступность в большинстве случаев, а просто запускать асинхронные сетевые запросы, информируя пользователя (через какой-либо индикатор активности), что приложение ожидает ответа от сети, и предоставляя пользователю возможность если, по их мнению, они ждали достаточно долго, вместо того, чтобы заблокировать пользовательский интерфейс или приложение.

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

Plus Reachability сообщает вам только о подключении к ближайшему/1-му сетевому переходу, который может обеспечивать или не обеспечивать подключение к остальной части Интернета или к вашему целевому сайту. Типичным примером могут быть все эти неправильно настроенные точки доступа WIFI.

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

person hotpaw2    schedule 28.12.2011
comment
Мне нравится этот ответ - я был на аналогичном техническом разговоре с Apple, где это было рекомендовано. Я бы не рекомендовал блокировать все приложение с помощью UIAlertView в соответствии с другим ответом, на мой взгляд, не очень дружелюбным! - person lxt; 29.12.2011

Это действительно зависит от вашего приложения. Вы можете сделать и то, и другое: отключить функциональность, когда Интернет недоступен, и проинформировать пользователя.

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

person Abizern    schedule 28.12.2011

Я рекомендую:

1) Всегда проверяйте подключение к Интернету перед выполнением любого интернет-запроса и обрабатывайте его соответствующим образом. 2) Иметь механизм опроса, который будет проверять доступность. Если недоступен, возможно, предупредите пользователя И отключите части вашей программы, которые делают интернет-запросы. Может быть, назовем это «Автономный режим».

person Jeremy    schedule 28.12.2011
comment
Проблема в том, что мое приложение бесполезно без подключения. Я бы предпочел иметь способ отключить приложение из appDelegate... может быть, я могу представить уведомление без кнопки и удалить его только тогда, когда сеть вернется... - person Hackmodford; 29.12.2011
comment
Все настройки выполняются в приложении настроек телефона. Моя проблема сейчас заключается в том, как отклонить предупреждение после его отображения. так как предупреждение выпускается после показа. - person Hackmodford; 29.12.2011
comment
Я хочу остановить ВСЕ взаимодействие с пользователем, когда нет сети, потому что приложение совершенно бесполезно... поэтому uialertview идеален! - person Hackmodford; 29.12.2011
comment
Сделайте свое приложение полезным, когда нет подключения к Интернету, хотя бы предоставив пользователю возможность увидеть справку или информацию или даже рекламу, говорящую о том, насколько фантастично ваше приложение, когда есть подключение. - person hotpaw2; 29.12.2011

Проверка наличия Интернета технически зависит от вас, как от разработчика, но Apple в прошлом отклоняла приложения за то, что они не уведомляли пользователей о том, что подключение к Интернету недоступно.

http://mobileorchard.com/avoiding-iphone-app-rejection-from-apple/ (#6)

person Flipper    schedule 28.12.2011