Нужна помощь с Reachability (2.0.3ddg) - PullRequest
3 голосов
/ 28 января 2010

Когда мое приложение запускается, я проверяю доступность, потому что мне нужно немедленное подключение к интернету. Моя проблема, однако, заключается в том, что кажется, что нет немедленного подтверждения для NetworkStatus, что означает, что сразу после настройки Reachability я проверяю, есть ли соединение, и возвращает, что нет, независимо от того, нахожусь ли я в Факт о Wi-Fi / 3G, или выключили радио.

Я могу подтвердить, что на самом деле я получаю подключение к Интернету, потому что сразу после запуска приложения ApplicationDidFinishLaunching появляется уведомление, которое затем записывает в журнал «ReachableViaWiFi» ..

Что я делаю не так? Почему это не подтверждает правильное подключение к Интернету сразу?

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];
    if (netStatus == NotReachable) {
        ErrorViewController *errorViewController = [[ErrorViewController alloc] initWithNibName:@"ErrorView" bundle:[NSBundle mainBundle]];
        [tabBarController.view removeFromSuperview];
        [window addSubview:[errorViewController view]];
        return;
    }
}

-(void)setupReachability {
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name:kReachabilityChangedNotification object: nil];
    hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
    [hostReach startNotifier];
}

-(void)reachabilityChanged:(NSNotification *)notification {
    Reachability* curReach = [notification object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    NetworkStatus netStatus = [curReach currentReachabilityStatus];
    BOOL connectionRequired = [curReach connectionRequired];
    switch (netStatus)
    {
        case NotReachable:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS];
            NSLog(@"NotReachable");
            connectionRequired = NO;  
            break;
        }

        case ReachableViaWWAN:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kREACHABLEVIAWWAN forKey:kREACHABILITYSTATUS];
            NSLog(@"ReachableViaWWAN");
            break;
        }
        case ReachableViaWiFi:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS];
            NSLog(@"ReachableViaWiFi");
            break;
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 28 января 2010

ОК, поэтому, попробовав несколько вещей сам, я действительно заставил его работать, добавив одну дополнительную строку кода:

-(void)setupReachability {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotificationV2 object:nil];
    hostReach = [[ReachabilityV2 reachabilityWithHostName:@"www.google.com"] retain];
    [hostReach connectionRequired]; // this line was added, and apparently forces a connection requirement..
    [hostReach startNotifier];
}
2 голосов
/ 28 января 2010

Пример кода Reachability предоставляет вам асинхронные обратные вызовы / уведомления, чтобы информировать вас о том, как / когда достижимость изменилась. Чтобы ваш код работал, вы должны изменить его следующим образом:

- (void) applicationDidFinishLaunching:(UIApplication *)application {

 // setup reachability
    [self setupReachability];
 }

Затем при обратном вызове, когда вы получаете уведомление, вы реагируете в соответствии с требованиями вашего приложения.

Другими словами, вы не можете сразу проверить состояние сети в applicationDidFinishLaunching(). Если вы хотите сделать это, то вы должны использовать синхронный / блокирующий метод, например, вы можете использовать код, приведенный в моем ответе на этот вопрос.

1 голос
/ 29 марта 2011

Вы должны сделать hostReach переменной уровня класса.

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