10

编辑 23.5.11

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

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

  • 我调用另一个应用程序,要么是 Safari 要么是 Maps,然后它们会进行自己的检查,如果没有连接就会失败。这使得用户在另一个失败的应用程序中,这并不完美。

因此,如果我按照下面的建议进行操作,并且标准的 Reachability 返回无法访问,然后我必须执行 NSURLConnection 以防收音机进入睡眠状态,那么我不确定这是否比仅仅尝试获取在线资源更好首先。

如果有人可以提供帮助 - 我将非常感激。我几乎准备好提交了,只需要正确处理即可。

我使用 Apple 的 Reachability 示例通常效果很好,除了当移动或蜂窝连接进入睡眠状态然后回来或 wifi 进入然后依赖蜂窝连接时。

当移动(蜂窝)连接没有改变时,它很好。这与我读过的评论一致,即当蜂窝无线电关闭时,您必须再次手动将其唤醒。但是,我不知道该怎么做。

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

此外,每当似乎没有联系时,我是否需要这样做,以防万一 - 这似乎是在浪费资源,而事实并非如此。egan iPod Touch 不在 wifi 范围内。

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

任何有用的建议都将受到热烈欢迎。

谢谢,

克里斯。

4

1 回答 1

13

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

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

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

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

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

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

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

对资源发出 HEAD 请求应该可以让您合理地了解外部应用程序是否能够在不需要您下载大量数据的情况下加载它(尽管延迟仍然是一个问题)。

于 2011-05-24T00:04:09.583 回答