Я знаю, что это немного старый, но выбранный ответ не идеален.
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 где-нибудь, чтобы код прошел.
Должен признаться - в этом примере я очень смущен. Я очень новичок в Cocoa, и я не уверен, что понимаю, как интегрировать этот пример C в мою программу ObjC. Советы? –
Нашел новый образец кода в Apple. См. Новый ответ. – Yuji