[英]What is the advantage of using Reachability?
使用Reachability比下面的代码有什么好处? 我觉得Reachability有很多代码,但如果它以任何方式更好,那么我会用它代替。
NSString *connectionString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
if ([connectionString length] == 0) {
//No connection
}
现在被授予,如果谷歌曾经失败,那么这将不起作用。 但实际上没有机会发生这种情况。 你怎么看? 谢谢!
这实际上是一个非常好的问题 - 我在公司招聘时在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不一定是编码天堂代码的顶峰。 在许多情况下,开发人员将使用自己的改进等修改可达性。
可达性的最大问题不在于它是错误的代码,还是使用不好的代码。 它现在实际上是相当不错的代码。 但是,为了一个无意的目的,误解和误用是很容易的代码。
以下是使用可达性的一些指导原则:
您可以在Mobile Safari中看到此行为。 如果页面加载失败,无论iPhone是否认为您有连接,您都可以重试。 如果网络可用且Mobile Safari注意到,它将自动重试。 感觉真的很自然。
请记住以下准则:
有几个关于移动网络的WWDC 2011会议值得关注。 (2010年有几个也解决了这个问题,我相信WWDC 2012会有几个。这不是一个简单的问题,它不会消失。)
另外: initWithContentsOfURL
是同步的。 不要在iOS上使用同步网络。 如果需要很长时间,iOS应用程序将退出您的应用程序。
可达性的一个优点是它可以在连接状态发生变化时向您发送通知。 这种方式可以通知您的用户可能会限制某些功能。
所有的好处。 我将补充:考虑使用NSURLConnection。 它有一个委托协议,可以通知您在尝试建立连接时发生的所有相关事件/事件。 它为您提供了更多的控制,即一个简单的initWithCintentsOfURL方法,并允许异步处理。 但是如果你从许多类中使用它,那么多次实现所有委托方法可能会很麻烦。 我将它包装在一个只有两个委托方法的自定义类中: didFail和didFinish ,并在我的所有代码中重用该类。
除了@ lxt的最佳答案之外,使用可访问性的另一个好理由是,如果您未在应用内部执行尽职调查以考虑连接方案,则您的应用将被拒绝。 Apple将测试您的应用程序是否有连接,如果它在这些情况下失败,您的应用程序甚至都不会被查看。
我全心全意地同意lxt的回答。 它为您提供了更多关于连接的详细信息,而不仅仅是“我可以连接到某个网站”。 好问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.