首先我要强调的是,我所说的是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上触发的函数中进行硬编码的可达性)。
请不要犹豫,要求详细说明。
答案 0 :(得分:8)
是的,您可以使用SCNetworkReachabilitySetCallback
和SCNetworkReachabilityScheduleWithRunLoop
。除非您要专门观看特定的网络接口,否则无需使用SCDynamicStore
。
如果你想看一个完整的例子,你可以看到我为NCIDpop(网络来电显示器)做了什么。在this file中搜索SCNetworkReachability
。 networkReachabilityCallback
函数中的注释可以让您了解所期望的状态转换(当我编写该代码时,这些转换并未得到很好的记录)。
答案 1 :(得分:3)
使用Apple Reachability sample code中的可访问性类。
特别是此示例使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中删除