我熟悉使用Reachability来确定iOS设备上使用的互联网连接类型(如果有的话).不幸的是,这不是一个很好的连接质量指标.具有低信号强度的无线网络非常粗略,任何低于3巴的3G都是一场灾难(更不用说只允许EDGE连接的网络).
如何确定连接的质量,以便我可以帮助用户决定是否应该在当前连接上下载更大的文件?
务实的方法是在应用程序开始时下载托管在可靠的全球CDN上的一个中等大小的文件.您事先知道文件大小,您只需要测量所需的时间,进行简单的计算,然后就可以估算出连接的质量.
例如,jQuery UI源代码,unminified,gzipped重约90kB.从http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.js下载它在我的Mac上需要327ms.所以可以假设我至少有一个可以处理大约300kB/s的合适连接(事实上,它可以处理更多).
诀窍是找到原始文件大小和网络延迟之间的良好平衡,因为在这样的小文件上永远不会达到完全下载速度.另一方面,在启动应用程序后立即下载1MB肯定会对大多数用户造成不利影响,即使它可以让您更准确地测量连接速度.
Cyrille的答案是一个很好的实用答案,但由于以下原因,最终并不是移动环境中的最佳解决方案:
它涉及在"应用程序开始时"进行测试,我认为这意味着他的应用程序何时启动.但是你的应用程序可能会执行很长一段时间,可能会进入后台然后再回到前台,而用户正在根据底层网络性能的变化改变网络上下文 - 这样初始测试结果可能与"当前"无关"网络连接的性能.
由于他正确指出的原因,它通过让用户在已经受限的网络条件下下载测试文件来"惩罚"你的用户.
您还在原始帖子中建议您希望用户根据您提供给他们的信息决定是否应该下载.但我建议这不是一种与移动用户进行交互的好方法 - 你不应该让他们做出复杂的决定.如果绝对必要,只要问你是否想要下载文件,如果你认为它可能会出现问题,但保持这么简单 - "你想下载XYZ文件(100 MB)吗?" 我个人甚至会避免这种情况.
而不是下载测试文件,更好的解决方案是监控和适应.随着时间的推移测量连接的性能,跟踪关于连接执行情况的信息的"新鲜度",并且仅根据正在进行的性能向用户做出决定.这似乎是必要的连接.
编辑:例如,如果您确定耐心阈值,在您看来代表可容忍的下载性能,请跟踪用户执行的每次下载,以确定是否达到该阈值.这样,您可以使用真实世界活动作为"连接质量"的决定因素,而不是通过测试下载来阻塞用户连接,这最终是关于连接质量的最终用户体验.如果您决定为用户提供取消下载的功能,那么您可以获得关于用户实际耐心阈值的出色"输入",并可以通过随后在开始下载之前给予他们选择来使您的功能适应该情况.如果您已经进入这种类型的"确认"模式,但随后发现文件开始下载速度更快,您可以动态退出确认模式.