OSX的网络连接NSNotification?

And*_*yer 3 macos cocoa objective-c nsnotifications

我只需要在分配有效的IP地址时发布通知.我已尝试通过SCReachability进行轮询,但这似乎效率低下.

有什么建议?这似乎应该很简单,但我已经挣扎了几个小时才能得到任何工作.

Jer*_*emy 10

我知道这有点旧,但选择的答案并不理想.

SCReachability API可用于了解特定主机何时可访问.如果您只想知道分配有效的IP地址(而不是指向目标IP的可行路由),那么您应该查看SCDynamicStore*API.这些函数允许您在特定值更改时订阅系统的配置存储以进行通知.因此,对于任何接口上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);
Run Code Online (Sandbox Code Playgroud)

您将需要复制scCallback函数,该函数将在发生更改时被调用.此外,您需要在某处调用CFRunLoopRun以使代码运行.