Получение онлайн / оффлайн уведомлений о доступности - PullRequest
5 голосов
/ 25 июня 2011

Позвольте мне сначала подчеркнуть тот факт, что я говорю о Mac OS X SDK, не iPhone.

Чтобы определить «связность» и получить флаги, я делаю что-то похожее на:

#import <SystemConfiguration/SystemConfiguration.h>
const char *hostName = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding];
SCNetworkReachabilityRef target = SCNetworkReachabilityCreateWithName(NULL, hostName);
SCNetworkConnectionFlags flags = 0;
SCNetworkReachabilityGetFlags(target, &flags);

Это хорошо для получения информации о доступности Google (именно это я и хочу знать).

Есть ли способ добавить наблюдателя к изменениям? Я изучал SCDynamicStore, но нахожу один пример от Apple и документацию немного ошеломляющим.

В идеале я бы хотел иметь возможность установить функцию для изменения флага, но этого будет достаточно: обратите внимание, когда IP «сброшен» / освобожден, и когда он получен. (Затем я мог бы сделать достижимость жестко закодированной в функции, которая запускается по полученному IP).

Пожалуйста, не стесняйтесь обращаться к подробностям.

Ответы [ 2 ]

8 голосов
/ 25 июня 2011

Да, вы можете использовать SCNetworkReachabilitySetCallback и SCNetworkReachabilityScheduleWithRunLoop. Вам не нужно использовать SCDynamicStore, если вы не хотите специально смотреть конкретный сетевой интерфейс.

Если вы хотите взглянуть на полный пример, вы можете увидеть, что я сделал для NCIDpop (средство отображения идентификатора вызывающего абонента сети). Искать SCNetworkReachability в этот файл . Комментарии в функции networkReachabilityCallback дают вам некоторое представление о том, какие переходы состояний следует ожидать (что было не очень хорошо задокументировано, когда я писал этот код).

3 голосов
/ 25 июня 2011

Используйте классы Reachability из Образец кода Apple Reachability .

  • Это хороший пример, чтобы понять, как работает Reachability
  • Это будет намного проще в использовании (и будет Objective-C, а не просто C)

В особенности в этом примере SCReachability публикует уведомление с именем kReachabilityChangedNotification об изменениях достижимости, поэтому вы можете легко добавить себя в качестве слушателя этого уведомления, используя:

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

Вы можете копировать / вставлять файлы Reachability.h & .m в свой проект (на самом деле это то, что делают все; я не знаю, почему Apple не добавила эти классы Obj-C непосредственно в их фреймворки!)

Примечание. Если вы все еще хотите использовать обычный C, вы также можете вызвать SCNetworkReachabilitySetCallback самостоятельно (как это сделано в приведенном выше примере Apple) и указать ему указатель на функцию C, в которой вы реализуете свой код. Если вы это сделаете, не забудьте запланировать достижимость в RunLoop, чтобы запустить процесс наблюдения, и удалить его из RunLoop, когда закончите

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