使用Reachability有什么好处?

Jac*_*ies 26 iphone ipod objective-c ipad ios

使用Reachability比下面的代码有什么好处?我觉得Reachability有很多代码,但如果它以任何方式更好,那么我会用它代替.

NSString *connectionString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

if ([connectionString length] == 0) {

    //No connection

}
Run Code Online (Sandbox Code Playgroud)

现在被授予,如果谷歌曾经失败,那么这将不起作用.但实际上没有机会发生这种情况.你怎么看?谢谢!

lxt*_*lxt 45

这实际上是一个非常好的问题 - 我在公司招聘时在iOS开发人员访谈中实际使用它是如此之好:

为什么Apple的可达性示例数百行,当您只需使用一行来检查URL是否响应时?

首先,网络可达性实际上非常非常复杂.它不仅仅是测试URL.想想以下示例:

  • 用户使用3G,但已用完了数据限额,因此每个请求都会重定向到运营商的网站.

  • 用户连接到需要身份验证/登录的公共WiFi网络,因此请求会重定向到登录页面

最后一个例子非常普遍 - 它一直在发生.但是,如果你使用initWithContentsOfURL你的应用程序会想象你有连接,而事实上你没有:你只需要返回网络重定向你的页面内容.

这就是为什么Apple的代码比你最初想象的要复杂得多的原因之一.您不应该只是问"我可以访问此URL",而是"从此URL返回的数据是我期望的 ".

但这真的只是冰山一角.除此之外,可达性还有很多 - 例如,我可能有一个需要下载大量信息的应用程序,比如50MB.如果用户在未经他们同意的情况下使用3G连接,那么简单地下载50MB数据将是一个坏主意 - 特别是如果他们正在漫游,或者是在受限制的数据计划上.因此,Reachability还会告诉您用户所处的连接类型:EDGE,3G,WiFi等(*注意:请参阅下面的注释,这可能不是最好的建议).

Reachability中的ReadMe.txt将告诉您更多关于代码可以做什么和不可以做什么的内容.

不幸的是,网上有太多人没有意识到有很多日常场景initWithContentsOfURL会返回有效的响应,但用户将无法连接.[博客这样的帖子] [1]在Google中被编入索引,人们认为它是可接受的替代品:它不是!

我在招聘时提出这个问题的原因之一是,它可以显示开发人员不只是在盒子里思考 - 就像你和许多其他开发人员一样,当我看到Reachability示例代码时我的第一反应是"哇,这看起来太复杂了对于非常简单的事情".但希望这个答案会在某种程度上说服你.


编辑:绝对注意下面史蒂文的评论.他提出了我的答案没有考虑的一些要点(即MiFi热点),并提出了一个有效的案例,即Reachability不一定是编码天堂代码的顶峰.在许多情况下,开发人员将使用自己的改进等修改可达性.

  • 可达性应该**永远不会被用作预检检查,但只是为了解释为什么某些东西不起作用.(我说这是一个开发人员,有一个应用程序在那里使用Reachability作为预检检查.这是一个不好的主意.) (9认同)
  • 这也是事实,但在判断这个问题的答案时我会谨慎.有许多理由不使用Reachability:即,这是一个庞大的混乱.是的,这个混乱有目的,但一个有效的问题是目的是否值得.最有价值的部分是在连接状态发生变化时收到通知,以便您可以重试连接,事实证明这只是几行代码. (7认同)
  • 事实上,要添加到最后一条评论:有些情况下可达性将报告网络连接无法访问.但是,如果您尝试连接而不是询问Reachability,那么它就可以访问.(而且,连接后,Reachability会告诉你,*它*可用.) (7认同)
  • 另外,在这个答案中建议依靠Reachability来确定网络连接的**类型**是非常糟糕的建议.可达性不能处理强制网络.如果你在有wifi的公共汽车上怎么办,但公共汽车通过3G提供wifi?你需要衡量.观看WWDC 2011会议200. (3认同)
  • 在Ipad 5.1.1上,Apple的可访问性代码正确报告了不可用性,但在重新获得网络访问权限时无法报告可用性.似乎如果您要使用它,它将用于确定服务器是否已关闭或iPad的网络已关闭,*在访问失败后*. (3认同)

Ste*_*her 29

可达性的最大问题不在于它是错误的代码,还是使用不好的代码.它现在实际上是相当不错的代码.但是,为了一个无意的目的,误解和误用是很容易的代码.

以下是使用可达性的一些指导原则:

  • 是的,使用Reachability.也许最明显的一点是:可达性可以成为让您的应用感觉更自然的巨大资产.
  • 切勿将可达性用作预检检查.仅仅因为Reachability报告网络当前不可用并不意味着如果您尝试使用它将无法使用它.您没有发送的网络请求可能会唤醒iOS的网络.
    • 编辑:实际上,我可能应该稍微软化一下.在短时间内推迟未经请求的操作可能是有意义的.在其他条件相同的情况下,最好连续进行所有联网,而不是反复打开和关闭硬件.如果可能的话就要破裂!但是你永远不应该阻止用户根据Reachability做某事.
  • 使用可达性来帮助诊断出现故障的原因.尝试建立网络后,Reachability会告诉您网络不可用.这是可用于构造良好错误消息的有用信息,可能比API返回的确切错误代码更重要.
  • 允许用户手动重试.用户可能知道网络应该在这个位置工作.不要依赖iOS注意到现在可以使用网络,并且可通过Reachability通知您.同样,尝试可能是让它可用的东西.
  • 使用Reachability的通知自动重试.当Reachability告诉您网络可用时,这是因为它可用.它可能会在你完成你的尝试之前再次下降,它可能是一个专属网络,但现在是再次尝试你的请求的好时机.

您可以在Mobile Safari中看到此行为.如果页面加载失败,无论iPhone是否认为您有连接,您都可以重试.如果网络可用且Mobile Safari注意到,它将自动重试.感觉真的很自然.

请记住以下准则:

  1. 移动网络并不简单.
  2. 唯一肯定的方式来确定网络连接成功是尝试一下,看看它是否没有成功.
  3. 确定网络连接是否实际成功并不总是微不足道的.

有几个关于移动网络的WWDC 2011会议值得关注.(2010年有几个也解决了这个问题,我相信WWDC 2012会有几个.这不是一个简单的问题,它不会消失.)

另外:initWithContentsOfURL是同步的.不要在iOS上使用同步网络.如果需要很长时间,iOS应用程序将退出您的应用程序.