在网络更改中更新iPhone可达性

时间:2011-05-19 17:56:57

标签: iphone app-store nsurlconnection reachability

编辑23.5.11

我现在想知道我是否过度设计了这个。当我使用在线连接时,我会正确处理它 - 或者:

  • 在后台显示进度或活动指示器,如果失败,我会显示一条合适的消息或

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

所以,如果我按照下面的建议行事并且标准可达性返回无法到达,那么我必须做一个NSURLConnection,以防收音机进入睡眠状态,然后我不确定这比仅仅试图获得更好首先是在线资源。

如果有人可以提供帮助 - 我真的很感激。我几乎准备好提交,只需要做到这一点。

我使用Apple的Reachability样本通常效果很好,除非移动或蜂窝连接进入休眠状态然后回来或wifi进入,然后依赖蜂窝连接。

移动(蜂窝)连接不变时很好。这与我读过的评论一致,当蜂窝无线电关闭时你必须再次手动唤醒它。但是,我看不出怎么做。

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

此外,每当似乎没有连接时我是否需要这样做,以防万一 - 这似乎浪费了资源,但可能不是那样。例如,无法通过wifi接触的iPod Touch。

我也看过DDG的替代方案,但看起来会有同样的问题。

欢迎任何有用的建议。

谢谢,

克里斯。

1 个答案:

答案 0 :(得分:13)

您不能也不应该使用Apple的Reachabilty示例代码(或SCNetworkReachabilityFlags)来确定网络资源是否可用。它们为您提供了有用的工具,可以为用户提供有关连接失败原因以及确定是否以及何时重试连接的反馈。但是,如果您想访问网络资源,您应该只是要求它。

不要根据可访问性标记向用户显示“无网络连接”警报。执行您的网络请求,如果失败,请检查可访问性标记和您自己的请求历史记录,以查看是否应该告诉用户请求失败或以静默方式重试。您不应该希望或需要在每次网络故障时向用户发送垃圾邮件。如果请求失败,请考虑在主机似乎可以访问的情况下重试它,并且仅在几次尝试之后或者当可达性标志表明您实际上已经丢失了网络连接而不是仅仅有一个请求失败时才向用户报告失败。

至于重新激活设备的无线电,您需要平衡尝试获取网络资源的愿望,同时允许设备关闭网络接口以节省电力。我不知道你的应用程序尝试做什么,但我建议允许设备关机,然后尝试连接以响应用户要求应用程序获取新数据。我没有看到您希望重新激活无线电的情况,只是为了向用户提示某些网络资源当前可能或可能无法访问。

请参阅https://devforums.apple.com/message/409618

  

了解主机是否可用的唯一方法是尝试连接它。如果该连接失败,您可以使用可访问性向用户提供反馈,并指导您的重试机制,但使用可达性来预检连接并不是一个好主意。

     

这里的关键问题是可达性使用本地信息来确定其结果。这并没有说明更广泛的互联网的状况。原始服务器可能已关闭,或者您与原始服务器之间的任何数量的链接可能已关闭,并且可达性将很高兴地说它可以访问。此时您将尝试连接,连接将失败。因此,您无论如何都必须处理错误,这意味着您也可以不进行预检,并让您的标准错误处理也包括在内。

在使用外部应用程序加载资源之前,请先查看有关检查资源的问题:https://devforums.apple.com/message/411329

如果外部应用程序能够加载它而不需要您下载大量数据(延迟仍然是一个问题,那么)对资源发出HEAD请求应该会让您有一个合理的想法。