Достижимое событие изменения сети не запускается - PullRequest
5 голосов
/ 21 декабря 2010

Мое приложение для iphone довольно простое с одним представлением, которое обрабатывает все, в viewDidLoad я проверяю, есть ли у нас подключение к Интернету, и если мы делаем, мы загружаем из Интернета, а если нет, мы загружаем из локального ресурса. И это прекрасно работает.

//in viewDidOnload    
[[NSNotificationCenter defaultCenter] addObserver:self 
                                          selector:@selector(handleNetworkChange:) 
                                          name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];

if (status == NotReachable) {
    //Do something offline
} else {
    //Do sometihng on line
}

- (void)handleNetworkChange:(NSNotification *)notice{
 NetworkStatus status = [reachability currentReachabilityStatus];
 if (status == NotReachable) {
  //Change to offline Message
 } else {
  //Relaunch online application
 }

}

Чтобы проверить событие handleNetworkChange, я отключил все сотовые данные, но оставил Wi-Fi включенным. В пределах диапазона Wi-Fi я запустил приложение, и все работает отлично. Затем я выхожу за пределы диапазона Wi-Fi, но мой handleNetworkChange никогда не срабатывает (протестировано с использованием uiAlertView). Находясь вне зоны действия Wi-Fi, мое приложение прекрасно запускает автономное сообщение.

Я подозреваю, что это проблема жизненного цикла ViewController. Должен ли этот код быть помещен в функцию AppDelegate? Возможно, это лучший дизайн для начала.

Ответы [ 4 ]

18 голосов
/ 21 декабря 2010

Оказывается, это была проблема управления памятью, так как я не сохранял переменную достижимости, поэтому, как только она выйдет из области видимости, будет вызван dealloc и вызван метод stopNotifier. Следовательно, нет обновлений, так как я бы вышел за пределы диапазона.

Так что вместо:

reachability = [Reachability reachabilityForInternetConnection];

Я делаю

reachability = [[Reachability reachabilityForInternetConnection] retain];

и все работает!

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

0 голосов
/ 12 апреля 2014

Вы должны включить systemconfiguration.framework в ваш проект.

0 голосов
/ 25 ноября 2013

Ваше приложение не работает в фоновом режиме.

Пожалуйста, добавьте этот метод в ваш делегат Класс

- (void)applicationDidEnterBackground:(UIApplication *)application
{ UIApplication* app = [UIApplication sharedApplication];

    UIBackgroundTaskIdentifier __block bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        });
    }];

}

Спасибо

0 голосов
/ 21 декабря 2010

Посмотрите на пример доступности от Apple. Я считаю, что они начинают свои уведомления в AppDelegate. В одном из моих приложений я создал логическую переменную, которая постоянно обновляется методом обновления подключения AppDelegate, поэтому в других моих контроллерах представления мне просто нужно вызвать делегата и проверить значение IsConnected bool.

Просто чтобы еще раз подумать здесь ... Я заметил проблемы с классом достижимости, в котором он может заморозить ваше приложение при проверке доступности. В моих новых приложениях я вообще пропускаю класс достижимости и скорее передаю методы делегата DidFail для NSUrlConnection и UIWebView, чтобы определить, есть ли у меня истинное соединение. Мне больше не нужно ждать, пока класс достижимости выяснит это, и я не могу решить, что делать, я просто продолжаю веб-вызов и использую локальный в качестве запасного варианта.

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...