2010-05-26 1 views
3

Мне просто нужно иметь уведомление, когда назначен действительный IP-адрес. Я опробовал опрос через SCReachability, но это кажется неэффективным.Сетевое подключение NSNotification для OSX?

Любые предложения? Это похоже на то, что это должно быть просто, но я боролся в течение нескольких часов, чтобы заставить что-то работать.

ответ

8

Я знаю, что это немного старый, но выбранный ответ не идеален.

API SCReachability API может использоваться, чтобы знать, когда доступен конкретный хост. Если все, что вы хотите знать, - это когда назначается действительный IP-адрес (а не жизнеспособный маршрут к целевому IP-адресу), тогда вы должны посмотреть на API SCDynamicStore *. Эти функции позволяют вам подписываться на хранилище конфигурации системы для уведомления при изменении определенных значений. Таким образом, для отправки уведомлений при изменении IPv4 адреса на любом интерфейсе вы могли бы сделать следующее (проверку ошибок удалено для удобства чтения)

SCDynamicStoreRef dynStore; 

    SCDynamicStoreContext context = {0, NULL, NULL, NULL, NULL}; 

    dynStore = SCDynamicStoreCreate(kCFAllocatorDefault, 
            CFBundleGetIdentifier(CFBundleGetMainBundle()), 
            scCallback, 
            &context); 

    const CFStringRef keys[3] = { 
     CFSTR("State:/Network/Interface/.*/IPv4") 
    }; 
    CFArrayRef watchedKeys = CFArrayCreate(kCFAllocatorDefault, 
             (const void **)keys, 
             1, 
             &kCFTypeArrayCallBacks); 
    if (!SCDynamicStoreSetNotificationKeys(dynStore, 
             NULL, 
             watchedKeys)) 
    { 
     CFRelease(watchedKeys); 
     fprintf(stderr, "SCDynamicStoreSetNotificationKeys() failed: %s", SCErrorString(SCError())); 
     CFRelease(dynStore); 
     dynStore = NULL; 

     return -1; 
    } 
    CFRelease(watchedKeys); 

    rlSrc = SCDynamicStoreCreateRunLoopSource(kCFAllocatorDefault, dynStore, 0); 
    CFRunLoopAddSource(CFRunLoopGetCurrent(), rlSrc, kCFRunLoopDefaultMode); 
    CFRelease(rlSrc); 

Вам нужно будет imlement функции scCallback, которая будет вызываться всякий раз, когда происходит изменение. Также вам нужно позвонить в CFRunLoopRun где-нибудь, чтобы код прошел.

1

Вам не нужно опроса SCNetworkReachability. Вы регистрируете обратный вызов, и система вызывает обратный вызов при изменении состояния сети. Это неэффективно.

См. Пример кода Apple Reachability, который показывает, как интегрировать его в приложение Objective-C. Код для iPhone, но я думаю, что Reachability.{m,h} должна работать на OS X.

(см от Apple пример кода SimpleReach. Это пять лет, но он должен работать.)

+0

Должен признаться - в этом примере я очень смущен. Я очень новичок в Cocoa, и я не уверен, что понимаю, как интегрировать этот пример C в мою программу ObjC. Советы? –

+0

Нашел новый образец кода в Apple. См. Новый ответ. – Yuji