5

首先让我强调一个事实,即我说的是 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);

这很好——获取关于谷歌可达性的信息(这正是我想知道的)。

有没有办法在更改中添加观察者?我一直在研究SCDynamicStore,但我发现 Apple 的单个示例和文档有点压倒性。

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

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

4

2 回答 2

8

是的,您可以使用SCNetworkReachabilitySetCallbackSCNetworkReachabilityScheduleWithRunLoopSCDynamicStore除非您想专门监视特定的网络接口,否则您不需要使用。

如果你想看一个完整的例子,你可以看看我为 NCIDpop(一个网络来电显示器)做了什么。SCNetworkReachability这个文件中搜索。函数中的注释networkReachabilityCallback让您了解预期的状态转换(当我编写该代码时,这些状态转换并没有很好地记录)。

于 2011-06-25T13:58:48.257 回答
3

使用Apple Reachability 示例代码中的 Reachability 类。

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

特别是这个示例使 SCReachability 发布了一个kReachabilityChangedNotification根据可达性更改命名的通知,因此您可以使用以下方法轻松地将自己添加为该通知的侦听器:

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

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

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

于 2011-06-25T13:57:27.210 回答