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

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

这对于获取 Google 可达性的信息来说没问题(这正是我想知道的)。

是否有一种方法可以添加一个观察者来跟踪这些变化?我一直在研究 SCDynamicStore,但我发现 Apple 提供的单一 example 和文档有点令人不知所措。

理想情况下,我希望能够设置一个函数来处理标志更改,但只要能够通知 IP 是“掉落”/释放还是被获取就足够了。 (然后我可以在触发 IP 获取的函数中硬编码可达性)。

如果需要详细解释,请不要犹豫敲我。

2个回答

8
是的,您可以使用 SCNetworkReachabilitySetCallbackSCNetworkReachabilityScheduleWithRunLoop。除非您想要专门监视特定的网络接口,否则无需使用SCDynamicStore
如果您想查看一个完整的示例,可以查看我为 NCIDpop(一个网络来电显示器)所做的内容。在此文件中搜索SCNetworkReachability。在networkReachabilityCallback函数中的注释会让您对预期状态转换有一些了解(当我编写该代码时,这些状态转换文档并不是非常好)。

3

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

  • 它是一个很好的示例,可以了解Reachability的工作原理
  • 它将更容易使用(并且将是Objective-C而不是普通的C语言)

特别是这个示例使得SCReachability在可达性改变时发布名为kReachabilityChangedNotification的通知,因此您可以轻松地将自己添加为此通知的侦听器:

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

你可以将Reachability.h和.m文件复制/粘贴到项目中(实际上这是每个人都在做的事情;我不知道为什么苹果没有直接将这些Obj-C类添加到它们的框架中!)
注意:如果您仍然想使用纯C,您也可以自己调用SCNetworkReachabilitySetCallback(就像上面的苹果示例中所做的那样),并将其指针传递给一个C函数,在其中实现您的代码。如果您这样做,请不要忘记在RunLoop上安排可达性以启动观察过程,并在完成后从RunLoop中删除它。

我之前尝试使用过Reachability.h/m,但都没有成功。现在我重新尝试了一下,并使用了链接中的Reachability.h和.m文件,但是需要做一些修复,这是正常的吗?例如:第235行:if ((flags & kSCNetworkReachabilityFlagsIsDirect) == kSCNetworkReachabilityFlagsIsDirect)kSCNetworkReachabilityFlagsIsWWAN kSCNetworkReachabilityFlagsIsDirect。目前尝试断开/重连/使主机在/etc/hosts中不可用并未向我的应用程序推送任何通知。 - Josh
不,这不正常。你尝试了哪个版本?我的意思是你最近下载了它吗?该示例已于2010年7月更新,以与iOS4兼容。在我的项目中,我使用的是版权为2008年的版本(我应该更新它!),并且没有任何关于第235行的内容... - AliSoftware
1
哦,好的。再读一遍我的问题的第一行,呵呵。我希望他们会在 Lion 中添加它,然后在那之前使用 Nicholas 的方法。但还是谢谢 :) - Josh
你试过使用SimpleReach示例代码了吗?没错,;) - AliSoftware
1
是的,但这并不是基于尼古拉斯的回答。这正是我现在正在尝试实现的,谢谢 :) - Josh
在iOS 8上,这个操作会延迟约5秒钟,这对我们来说是不幸的。 - cynistersix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接