如何在iOS中确定连接的质量?

如何在iOS中确定连接的质量?,ios,Ios,我熟悉使用可达性来确定iOS设备上使用的internet连接类型(如果有)。不幸的是,这不是连接质量的一个好指标。低信号强度的Wifi非常简陋,任何小于3条的3G都是一场灾难(更不用说只允许边缘连接的网络了) 如何确定连接的质量,以便帮助用户决定是否应在当前连接上下载较大的文件?一种实用的方法是在应用程序开始时下载一个托管在可靠的全球CDN上的中等大小的文件。您事先知道文件大小,只需测量所需时间,进行简单计算,然后就可以估计连接的质量 例如,jQueryUI源代码(未统一、gzip)的重量大约为

我熟悉使用可达性来确定iOS设备上使用的internet连接类型(如果有)。不幸的是,这不是连接质量的一个好指标。低信号强度的Wifi非常简陋,任何小于3条的3G都是一场灾难(更不用说只允许边缘连接的网络了)


如何确定连接的质量,以便帮助用户决定是否应在当前连接上下载较大的文件?

一种实用的方法是在应用程序开始时下载一个托管在可靠的全球CDN上的中等大小的文件。您事先知道文件大小,只需测量所需时间,进行简单计算,然后就可以估计连接的质量

例如,jQueryUI源代码(未统一、gzip)的重量大约为90kB。从我的Mac上下载它需要327毫秒。因此,可以假设我至少有一个可以处理大约300kB/s的连接(事实上,它可以处理更多)


诀窍是在原始文件大小和网络延迟之间找到良好的平衡,因为像这样的小文件永远不会达到完全下载速度。另一方面,在启动应用程序后立即下载1MB肯定会惩罚大多数用户,即使这样可以更精确地测量连接速度。

Cyrille的答案是一个很好的实用答案,但最终并不是移动环境下的一个很好的解决方案,原因如下:

  • 它包括“在应用程序启动时”进行测试,我想他指的是应用程序启动时。但您的应用程序可能会执行很长一段时间,可能会进入后台,然后又回到前台,并且用户始终在改变网络上下文,从而改变基础网络性能,因此初始测试结果可能与网络连接的“当前”性能无关
  • 出于这个原因,他正确地指出,这是“惩罚”你的用户,让他们在可能已经受限的网络条件下下载测试文件
您还建议在原始帖子中,您希望您的用户根据您提供给他们的信息来决定是否应该下载。但我认为这不是一个与移动用户互动的好方法——你不应该要求他们做出复杂的决定。如果绝对必要,只在您认为可能存在问题时询问他们是否要下载该文件,但要保持简单——“您想下载XYZ文件(100 MB)”我个人甚至会避免这样做

与其下载测试文件,更好的解决方案是监视并调整。在进行过程中测量连接的性能,跟踪您所掌握的有关连接性能的信息的“新鲜度”,并仅根据连接的持续性能向您的用户提供决策


编辑:例如,如果您确定的耐心阈值在您看来代表了可容忍的下载性能,请跟踪用户进行的每次下载,以确定是否达到该阈值。这样,您就不用测试下载来堵塞用户连接,而是使用真实世界的活动作为“连接质量”的决定因素,这最终关系到最终用户对连接质量的体验。如果您决定向用户提供取消下载的功能,那么您就有一个关于用户实际耐心阈值的极好的“输入”,并且可以通过在用户开始下载之前为他们提供选择,使您的功能适应这种情况。如果您切换到这种类型的“确认”模式,但随后发现文件下载速度开始加快,则可以动态退出确认模式。

Rob的回答很好,但对于更具体的实现,请从()


针对要监视连接质量的服务器的域。使用ping库定期“ping”它(比如1秒或10秒,取决于您的UI需要)。测量需要多长时间才能获得对ping的响应(或者如果ping从未返回),以评估与用户通信的连接质量。

虽然这测量速度,但实际上并不测量质量。由于TCP的保险,50Mb/s的连接和大量的数据包丢失对于下载一个文件来说是很好的,但是通过UDP的VoIP连接会受到数据跌落、爆裂声和伪影的影响。速度!=质量。OP说用户“应该下载更大的文件”,所以我假设他不处理实时协议。我只是把区别弄清楚,不是说你的答案不正确或没有帮助。对不起,我不清楚。没问题,你说得对。并不是每个人都意识到这一差异。这里没有答案,这只是移动最佳实践的集合。答案是“监控并适应”,因为移动连接的质量是暂时的。在任何情况下,确定网络连接的质量都是非常复杂的,但是在移动设备上尝试在不断变化的条件下这样做,然后对用户进行真正相关的选择,是不现实的。如果不是这样的话,iOS会将其包装起来,并将其作为一个简单的值提供给我们,而不仅仅是可达性提供给我们的值。将编辑答案,以更多地说明我所说的监控和调整。问题是“我如何监控?”如果我对问题的编辑解释了我的观点,或者您希望我提供更详细的建议,请告诉我。这里确实没有单一的答案。但这不是一个只有一个答案的问题。我