2011-07-21 3 views
2

Я хотел интегрировать уведомление о сетевом статусе в свой проект и использовать для этого класс достижимости Яблок. Тем не менее, я мог бы найти ошибку в своем коде или, возможно, также вызван самим симулятором.Тяжелая ошибка в исходном коде Apple? (достижимостьForLocalWiFi)

код здесь:

- (void)start { 

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

    Reachability *wifi = [[Reachability reachabilityForLocalWiFi] retain]; 
    [wifi startNotifier]; 

} 

- (void)updateStatus:(NSNotification *)notice { 
    NetworkStatus s = [[notice object] currentReachabilityStatus]; 
    if(s == NotReachable) { 
     NSLog(@"Wifi not reachable"); 
    } else { 
     NSLog(@"Wifi is reachable"); 
    } 
} 

Теперь, что происходит, когда "старт" называется:

1) сообщение UpdateStatus не уволили - все в порядке, может быть не ошибка, может быть, это нормальное поведение

2) сообщение updateStatus увольняется, когда я выключаю свой Mac-сервер, а затем networkstatus является экв. к «NotReachable», НО когда я включаю аэропорт Мака снова сообщение UpdateStatus уволит И NETWORKSTATUS ОСТАЕТСЯ «NotReachable»

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

- (void)start { 

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

    Reachability *wifi = [[Reachability reachabilityForLocalWiFi] retain]; 
    [wifi startNotifier]; 

    /* Added */ 
    [NSTimer scheduledTimerWithTimeInterval:0.5F target:self selector:@selector(updateSeparately:) userInfo:nil repeats:YES]; 
    /* * */ 

} 

и метод "updateSeparately" сам

/* Added */ 
- (void)updateSeparately:(NSTimer *)timer { 

    NetworkStatus s = [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus]; 

    if(s == NotReachable) { 
     NSLog(@"updateSeparately:Wifi not reachable"); 
    } else { 
     NSLog(@"updateSeparately:Wifi is reachable"); 
    } 
} 
/* * */ 

дает мне следующие результаты в консоли для следующих сценариев:

1) AirPort включен, я запустить приложение и включите AirPort от

... 
2011-07-21 09:41:41.242 MyProject[7091:207] updateSeparately:Wifi is reachable 
2011-07-21 09:41:41.742 MyProject[7091:207] updateSeparately:Wifi is reachable 
2011-07-21 09:41:42.242 MyProject[7091:207] updateSeparately:Wifi is reachable 
2011-07-21 09:41:42.264 MyProject[7091:207] --- Status Change --- 
2011-07-21 09:41:42.265 MyProject[7091:207] Wifi not reachable 
2011-07-21 09:41:42.743 MyProject[7091:207] updateSeparately:Wifi not reachable 
2011-07-21 09:41:43.243 MyProject[7091:207] updateSeparately:Wifi not reachable 
2011-07-21 09:41:43.743 MyProject[7091:207] updateSeparately:Wifi not reachable 
... 

это кажется правильным

2) после того, как AirPort выключен, я снова включите его (App еще бег)

... 
2011-07-21 09:45:42.702 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:43.202 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:43.701 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:43.795 MyProject[7133:207] --- Status Change --- 
2011-07-21 09:45:43.795 MyProject[7133:207] Wifi not reachable 
2011-07-21 09:45:44.200 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:44.700 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:45.200 MyProject[7133:207] updateSeparately:Wifi not reachable 
2011-07-21 09:45:45.701 MyProject[7133:207] updateSeparately:Wifi is reachable 
2011-07-21 09:45:46.201 MyProject[7133:207] updateSeparately:Wifi is reachable 
2011-07-21 09:45:46.701 MyProject[7133:207] updateSeparately:Wifi is reachable 
... 

это показывает, что изменение NetworkStatus было замечено .... но почему это остаться «NotReachable» в течение ~ 2 секунд?

У кого-нибудь есть объяснение?

PS. То же самое происходит и в Sample Project достижимости в компании Apple (доступна здесь http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html)

Спасибо за чтение,

Mizer

+0

Вы пробовали работать на устройстве? – bobbypage

ответ

2

Используйте этот достижимости класс here

Я использую его во всех своих программах и работает очень хорошо.

2

, вероятно, не имеет значения на данный момент (9 месяцев спустя), но я проверял эту информацию о достижимости и нашел вероятное объяснение за 2-секундную задержку от недоступной для достижения цели. Может быть связано с именем разрешающего, как описано в http://developer.apple.com/library/ios/samplecode/Reachability/Listings/ReadMe_txt.html#//apple_ref/doc/uid/DTS40007324-ReadMe_txt-DontLinkElementID_7

ВАЖНО: достижимости должны использовать DNS для разрешения имени хоста перед тем он может определить достижимость этого хозяина, и это может занять некоторое время на некоторых сетевых подключений. Из-за этого API вернет NotReachable до тех пор, пока разрешение имен не будет завершено.Эта задержка может быть видна в интерфейсе в некоторых сетях.

Я думаю, что изменение проверки с именованного хоста (apple.com по умолчанию) на ip должно решить проблему.

Смежные вопросы