2010-05-26 85 views
3

我只需要在分配有效的IP地址時發出通知帖子。我試圖通過SCReachability進行輪詢,但這似乎是低效的。網絡連接NSNotification for OSX?

有什麼建議嗎?這似乎應該很簡單,但我一直在掙扎幾個小時才能找到任何工作。

回答

8

我知道這是一個有點老,但在選擇的答案並不理想。

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); 

您需要imlement的scCallback功能,每當有一個變化,這會被調用。此外,您還需要在某處調用CFRunLoopRun以使代碼可用。

1

您不必使用SCNetworkReachability進行投票。您註冊回調,系統在網絡狀態改變時調用回調。這不是低效的。

請參閱Apple的示例代碼Reachability,其中顯示瞭如何將其集成到Objective-C應用程序中。該代碼是爲iPhone,但我認爲Reachability.{m,h}應該在OS X上運行

(見蘋果的示例代碼SimpleReach。這是五十歲,但應該工作。)

+0

我不得不承認 - 在這個例子中我非常困惑。我對Cocoa非常陌生,我不確定如何將這個C例程集成到我的ObjC程序中。提示? – 2010-05-28 22:46:44

+0

在Apple找到一個更新的示例代碼。看到新的答案。 – Yuji 2010-05-28 23:01:38