我只需要在分配有效的IP地址時發出通知帖子。我試圖通過SCReachability進行輪詢,但這似乎是低效的。網絡連接NSNotification for OSX?
有什麼建議嗎?這似乎應該很簡單,但我一直在掙扎幾個小時才能找到任何工作。
我只需要在分配有效的IP地址時發出通知帖子。我試圖通過SCReachability進行輪詢,但這似乎是低效的。網絡連接NSNotification for OSX?
有什麼建議嗎?這似乎應該很簡單,但我一直在掙扎幾個小時才能找到任何工作。
我知道這是一個有點老,但在選擇的答案並不理想。
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以使代碼可用。
您不必使用SCNetworkReachability
進行投票。您註冊回調,系統在網絡狀態改變時調用回調。這不是低效的。
請參閱Apple的示例代碼Reachability,其中顯示瞭如何將其集成到Objective-C應用程序中。該代碼是爲iPhone,但我認爲Reachability.{m,h}
應該在OS X上運行
(見蘋果的示例代碼SimpleReach。這是五十歲,但應該工作。)
我不得不承認 - 在這個例子中我非常困惑。我對Cocoa非常陌生,我不確定如何將這個C例程集成到我的ObjC程序中。提示? – 2010-05-28 22:46:44
在Apple找到一個更新的示例代碼。看到新的答案。 – Yuji 2010-05-28 23:01:38