objective-c - OSX 的网络连接 NSNotification?

标签 objective-c cocoa macos nsnotifications

我只需要在分配有效的 IP 地址时有一个通知帖子。我试过通过 SCReachability 进行轮询,但这似乎效率很低。

有什么建议吗?这看起来应该很简单,但我已经努力了几个小时才让一切正常。

最佳答案

我知道这有点老了,但选择的答案并不理想。

SCReachability API 可用于了解特定主机何时可达。如果您只想知道何时分配了有效的 IP 地址(而不是通往目标 IP 的可行路由),那么您应该查看 SCDynamicStore* API。 这些函数允许您订阅系统的配置存储,以便在某些值发生变化时收到通知。 因此,要在任何接口(interface)上的 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);

您需要实现 scCallback 函数,只要有变化就会调用该函数。此外,您还需要在某处调用 CFRunLoopRun 以使代码运行。

关于objective-c - OSX 的网络连接 NSNotification?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2910121/

相关文章:

objective-c - 计划中的单例 NSDictionary 子类的替代方案

ios - SDImageCache - 4.0 迁移后无法识别的选择器错误

objective-c - 如何将新的类文件关联为特定场景的 View Controller ?

Objective-C 异步回调

macos - NSTask 从沙盒应用程序中生成

Java SWT 更改所选小部件上的标签文本在 Mac 上不起作用

ios - 当您快速滚动时,异步加载的 tableView 单元格图像会闪烁

c# - MonoMac:无法创建合并的 Mono 应用程序包

cocoa-touch - NSOperationQueue 什么时候开始它的第一个操作?

macos - 将 NSArrayController 绑定(bind)到 NSSearchField 并在 NSTableView 中查看结果