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

Posted

技术标签:

【中文标题】获取在线/离线可达性通知【英文标题】:Getting online/offline reachability notifications 【发布时间】:2011-06-25 13:52:24 【问题描述】:

首先我要强调一点,我说的是 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 时触发的函数中硬编码可达性)。

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

使用来自Apple Reachability sample code 的可达性类。

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

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

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

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

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

【讨论】:

我之前尝试过使用 Reachability.h/m,但没有成功。我再次尝试,并使用了链接中的 Reachability.h & .m,但我必须做一些修复,这正常吗?即:第 235 行:if ((flags &amp; kSCNetworkReachabilityFlagsIsDirect) == kSCNetworkReachabilityFlagsIsDirect)kSCNetworkReachabilityFlagsIsWWAN kSCNetworkReachabilityFlagsIsDirect。尝试在 /etc/hosts 中断开/重新连接/使主机不可用目前不会向我的应用推送任何通知。 不,这不正常。你试过哪个版本?我的意思是你最近下载了吗?该示例已于 2010 年 7 月更新为与 ios4 兼容。在我自己的项目中,我使用版权为 2008 的版本(我应该更新它!)并且在第 235 行没有任何内容... 哦,好的。再读一遍我的问题的第一行,呵呵。我希望他们将它添加到 Lion 中,然后使用 Nicholas 的方法直到那时。但是谢谢:) 对 ;) 你也试过SimpleReach sample code 吗? 是的,但这不是 Nicholas 的回答。这就是我现在要实现的,谢谢:)

以上是关于获取在线/离线可达性通知的主要内容,如果未能解决你的问题,请参考以下文章

使用可达性通知用户互联网连接

如何从 iOS 可达性类中获取网络连接通知的变化?

微信为啥不丢“离线消息”?

通知用户可达性(Ashley Mills 的可达性)

暂停应用程序的可达性更改 iOS 系统通知

通知哪个调用与可达性无关