使用 Reachability 比下面的代码有什么优势?我觉得 Reachability 的代码量很大,但如果它在任何方面都更好,那么我会改用它。
NSString *connectionString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
if ([connectionString length] == 0) {
//No connection
}
现在承认,如果 Google 出现故障,那么这将行不通。但实际上不可能发生这种情况。你怎么看?谢谢!
最佳答案
这实际上是一个非常好的问题 - 非常好,以至于我在公司招聘时在 iOS 开发人员面试中实际使用了它:
Why is Apple's reachability example hundreds of lines long, when you can just use a single line to check if a URL is responsive?
首先,网络可达性实际上非常非常复杂。它不仅仅是简单地测试 URL。考虑以下示例:
用户使用 3G,但已用完数据限额,因此每 请求重定向到运营商的网站。
用户连接到公共(public) WiFi 网络需要 身份验证/登录,因此请求重定向到登录页面
最后一个例子非常普遍 - 它一直在发生。但是,如果您使用 initWithContentsOfURL
,您的应用程序会认为您有连接,而实际上您没有:您只会返回网络将您重定向到的页面的内容。
这就是为什么 Apple 的代码比您最初想象的要复杂的原因之一。您不应该只是问“我能到达这个 URL 吗”,“从这个 URL 返回的数据是否符合我的预期”。
但这只是冰山一角。除此之外,可达性还有很多作用——例如,我可能有一个应用程序需要下载大量信息,比如 50MB。如果用户在未经他们同意的情况下使用 3G 连接,那么简单地下载 50MB 的数据将是一个坏主意——尤其是当他们正在漫游或使用受限的数据计划时。因此可达性还会告诉您用户使用的连接类型:EDGE、3G、WiFi 等(*注意:请参阅下面的注释,这可能不是最好的建议)。
Reachability 中的 ReadMe.txt 将告诉您更多有关代码可以做什么和不能做什么的信息。
不幸的是,网上有太多人没有意识到在许多日常场景中 initWithContentsOfURL
将返回有效响应但用户不会有连通性。 [像这样的博客文章][1] 在 Google 中被编入索引,人们认为它是一个可以接受的替代品:它不是!
我在招聘时问这个问题的原因之一是它可以表明开发人员不只是在框内思考 - 就像您和许多其他开发人员一样,当我看到 Reachability 示例代码时,我的第一 react 是“哇,这似乎对于非常简单的事情来说太复杂了”。但希望这个答案能够以某种方式说服您。
编辑:一定要注意下面史蒂文的评论。他提出了我的回答没有考虑的一些要点(即 MiFi 热点),并提出了一个有效的案例,即可达性不一定是编码天堂的顶峰。在许多情况下,开发人员会通过自己的改进等方式修改 Reachability。
关于iphone - 使用 Reachability 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7178330/