获取在线/离线可达性通知

时间:2011-06-25 13:52:24

标签: objective-c cocoa macos notifications reachability

首先我要强调的是,我所说的是Mac OS X SDK,不是 iPhone。

为了确定“连通性”并获得标志,我做了类似的事情:

#import <SystemConfiguration/SystemConfiguration.h>
const char *hostName = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding];
SCNetworkReachabilityRef target = SCNetworkReachabilityCreateWithName(NULL, hostName);
SCNetworkConnectionFlags flags = 0;
SCNetworkReachabilityGetFlags(target, &flags);

仅此而已 - 获取有关Google可访问性的信息(这正是我想知道的)。

有没有办法为变化添加观察者?我一直在研究SCDynamicStore,但我发现Apple的单example和文档有点压倒性。

理想情况下,我希望能够为标志更改设置一个函数,但这就足够了:注意IP被“删除”/释放,以及何时获得。 (然后我可以在获得的IP上触发的函数中进行硬编码的可达性)。

请不要犹豫,要求详细说明。

2 个答案:

答案 0 :(得分:8)

是的,您可以使用SCNetworkReachabilitySetCallbackSCNetworkReachabilityScheduleWithRunLoop。除非您要专门观看特定的网络接口,否则无需使用SCDynamicStore

如果你想看一个完整的例子,你可以看到我为NCIDpop(网络来电显示器)做了什么。在this file中搜索SCNetworkReachabilitynetworkReachabilityCallback函数中的注释可以让您了解所期望的状态转换(当我编写该代码时,这些转换并未得到很好的记录)。

答案 1 :(得分:3)

使用Apple Reachability sample code中的可访问性类。

  • 了解可达性如何工作
  • 是一个很好的例子
  • 它将更容易使用(并且将是Objective-C而不是普通的C)

特别是此示例使SCReachability在可达性更改时发布名为kReachabilityChangedNotification的通知,因此您可以使用以下方法轻松添加自己作为此通知的侦听器:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

您可以复制/粘贴Reachability.h&amp;项目中的.m文件(实际上这就是每个人所做的;我不知道为什么Apple没有直接在他们的框架中添加这个Obj-C类!)

注意:如果您仍想使用普通C,您也可以自己调用SCNetworkReachabilitySetCallback(如上面Apple示例中所做的那样),并为其指定一个C函数实现你的代码。如果您这样做,请不要忘记在RunLoop上安排可达性以启动观察过程,并在完成后从RunLoop中删除