在网络变化时更新iPhone可达性

10

编辑23.5.11

我现在在想我是否过度设计了。当我使用在线连接时,我会正确处理它 - 要么:

  • 在后台显示进度或活动指示器,如果失败,则显示适当的消息;或者

  • 调用另一个应用程序,例如Safari或Maps,然后它将进行自己的检查,如果没有连接,则失败。这会让用户处于已失败的其他应用程序中,这并不完美。

因此,如果我按照下面建议的做法,标准的Reachability返回不可达,那么我就必须进行NSURLConnection以防无线电休眠,那么我不确定这是否比一开始尝试获取在线资源更好。

如果有人能帮忙 - 我会非常感激。我几乎准备好提交了,只需要把这个问题搞定。

我正在使用苹果的Reachability示例,效果还不错,除了移动或蜂窝连接进入睡眠模式然后恢复或wifi断开连接,然后依赖于蜂窝连接。

当移动(蜂窝)连接不发生变化时,一切都很好。这符合我读到的评论,即当蜂窝无线电关闭时,您必须手动唤醒它。但是,我不知道该怎么做。

我需要设置一个NSURLConnection吗?有一些示例代码会很好。当我收到没有连接的通知时,我会发送NSURLConnection并告诉用户稍后再试一次,然后如果我收到回调说它成功了,我会覆盖Reachability的关闭设置吗?

此外,每当似乎没有连接时,我需要这样做吗?以防万一是那样的情况——当可能并非如此时,这似乎会浪费资源。例如,一个不在WiFi范围内的iPod Touch。
我还看了DDG的替代方案,但看起来它将有同样的问题。
任何有帮助的建议都将受到热烈欢迎。
谢谢,
克里斯。
1个回答

13
你不能也不应该使用苹果的可达性示例代码(或SCNetworkReachabilityFlags)来确定网络资源是否可用。它们为您提供了有用的工具,以便向用户反馈连接失败的原因,并确定何时重试连接。但是,如果您想访问网络资源,只需请求即可。
不要基于可达性标志向用户显示“无网络连接”警报。执行网络请求,如果失败,则检查可达性标志和自己的请求历史记录,以查看是否应告诉用户请求失败或悄悄地重试。您不应该希望或需要在每次网络故障时向用户发送大量通知。如果请求失败,请考虑在主机似乎可达时重试它,并仅在几次尝试或可达性标志表明您实际上已经失去网络连接而不仅仅是单个请求失败时向用户报告失败。
至于重新激活设备的无线电,您需要权衡您尝试获取网络资源的愿望与允许设备关闭网络接口以节省电力之间的关系。我不知道您的应用程序试图做什么,但我建议允许设备关闭,然后在用户要求应用程序获取新数据时尝试连接。我没有看到您需要重新激活无线电的情况,只是为了提示用户某些网络资源可能当前可达或不可达。
请参见https://devforums.apple.com/message/409618
唯一检测主机是否可用的方法是尝试连接它。如果连接失败,您可以使用可达性(reachability)向用户提供反馈并指导重试机制,但是使用可达性作为连接预检不是一个好主意。 关键问题在于,可达性使用本地信息来确定其结果。这并没有说明更广泛的互联网状态。原始服务器可能已关闭,或者您和原始服务器之间的任何链接可能已关闭,而可达性将高兴地说它是可到达的。此时,您将尝试连接,而连接将失败。因此,您将不得不处理错误,这意味着您也可以不进行预检,并让您的标准错误处理同样覆盖此情况。
另请参阅检查外部应用程序加载资源之前的资源的问题:https://devforums.apple.com/message/411329 对资源进行 HEAD 请求应该能够为您提供合理的想法,以便外部应用程序能够在无需下载大量数据的情况下加载它(延迟仍然是个问题)。

1
哇,Jonah,回答得真好,清晰详细。你在任何地方教过课吗? - Kolya Miller
然而,你可以使用可达性代码来在“可达性状态”改变时得到通知。 - Alexsander Akers
谢谢@Jonah - 这是一个很棒、权威的回答。我认为你的清晰度将会帮助很多人,正如在你回答之前我们已经看到的投票一样。现在我将大大简化我的流程。再次感谢。 - Chris
@Alexsander - 是的,你可以这样做,但我不确定那些信息有多可靠。 - Chris
@forsvarir - 我提供了悬赏,因为这是一个我想要一个好答案的好问题。Jonah似乎已经解决了这个问题,但我想再等一会儿,以防其他重量级人物想要加入。 - Rayfleck
显示剩余6条评论

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