最大化iOS 11中的连接性

2017年8月24日

我们已经让您知道了要为iOS 11准备的事情,现在我们正在研究更具体的内容:即将到来的iOS更新将如何处理较差的网络连接。 外行用户只需要知道您使用的移动数据可能会比更新到iOS 11之前要多一些。但是对于我们的开发人员,我们将在下面深入探讨此主题。 戴上工程师帽!

在iOS 11中,Apple对URLSession系列API进行了许多改进。 这些改进从开发人员的生活质量更新到显着的性能提升,无疑将改善整个平台的用户体验。 在本文中,我们将特别介绍两项改进:URLSession内置的多路径TCP支持和可达性监视。

多路径TCP

优雅地处理恶劣的网络条件是应用程序精心打造和完善的必然标志。 与手机上的其他大多数应用程序相比,您是否注意到Siri似乎很少有连接问题吗? 原因是多路径TCP。 当Siri发出网络请求时,该应用实际上打开了与服务器的两个连接:一个通过Wi-Fi,一个通过蜂窝。 这些连接一起工作,可以尽快将数据传送到应用程序。 只要您的设备在两个通道之一上都具有良好的连接,Siri就可以正常工作。

多路径TCP是一种相对较新的协议,专门为移动设备设计。 它建立在TCP之上,因此可以从TCP内置的可靠性和拥塞控制中受益。 此外,MPTCP允许在无线和蜂窝连接之间无缝切换。 它甚至支持同时使用两个连接以提高吞吐量(稍后会对此进行更多介绍)。

为了利用MPTCP,在客户端和服务器级别都需要支持。 当前,并非所有服务器基础架构都支持MPTCP,但像AWS这样的流行供应商都支持。 使用iOS 11,应用程序开发人员现在也可以在客户端级别支持MPTCP。

模式

在iOS 11中,应用程序可以选择三种不同的MPTCP模式:切换模式,交互模式和聚合模式

  • 切换模式:如果可能,将通过Wi-Fi建立连接。 如果Wi-Fi网络条件不佳,系统将自动启动蜂窝链路并将流量传输到该链路。 随着Wi-Fi条件的改善,流量将被转移回Wi-Fi连接,并且蜂窝链路将被拆除。 本质上,切换模式试图在保持可接受性能的同时最小化蜂窝使用。 所有这些都发生在URLSession中,并且对我们的应用程序完全透明。
  • 交互模式:系统将立即启动Wi-Fi和蜂窝链接。 尽管仍然首选Wi-Fi,但如果发现Wi-Fi条件不理想,该系统将积极过渡到蜂窝网络。 交互模式针对性能进行了优化,但以蜂窝数据的使用为代价。 Siri使用交互模式。
  • 聚合模式:与交互模式一样,系统将立即启动两个链接。 但是, 两个链接将一起使用以增加网络的整体吞吐量。 理论上,在10mbps Wi-Fi连接和5mbps蜂窝网络上使用聚合模式可能会导致与服务器的15mbps连接! 虽然这很酷,但会导致大量的蜂窝数据使用。 因此,Apple不允许在生产应用程序中运行聚合模式。 但是,开发人员可以通过“设置”应用中的“开发人员设置”屏幕使用汇总模式。

无论使用哪种模式,如果您的应用达到了Wi-Fi辅助数据限制,蜂窝链接将被禁用。 如果要测试应用程序,请注意这一点,并注意MPTCP不再切换到蜂窝网络。 这很好地表明您可能需要重新考虑哪些呼叫选择了加入MPTCP。

选择加入

那么,您如何选择加入? 苹果公司做到了这一点非常容易。 只需在Xcode中向您的应用程序添加“ multipath”功能,然后将URLSessionConfiguration上的multipathServiceType属性设置为.handover.interactive。 而已!

可达性

在iOS中,良好的可访问性处理一直是棘手的,这主要是由于缺少对它的可靠的高级支持。 大多数应用程序使用第三方可达性库,所有这些库均基于Apple的SCNetworkReachability低级API构建。 这种方法存在一些问题:库不是特别可靠,并且未与URLSession集成。 如果开发人员需要推迟发出网络请求,直到网络状况改善或重试网络请求,他们必须自己重新构建该功能。 最终,这对开发人员来说很麻烦,导致无法达到理想的可处理性,并且还浪费了一些时间来完善用户体验。 开发人员通常会采用简单的方法,并在失去连接后立即显示全屏模式,从而使用户完全无法使用应用程序。

苹果已经改善了iOS 11中的许​​多难题。URLSession现在可以监视网络状况并等待启动任务。 您可以通过在会话的配置上将waitsForConnectivity设置为true来轻松选择这种行为。 选择使用waitsForConnectivity时 ,URLSession将立即加载请求或在网络条件允许时立即加载请求。 虽然为实现向后兼容性,将waitsForConnectivity默认设置为false ,但Apple建议为几乎所有请求启用它。

除了延迟网络请求外,URLSession现在还会在连接不良时通知您的应用程序。 这是通过urlSession(_:taskIsWaitingForConnectivity 🙂委托回调完成的。 您可以插入此委托回调,并使用它来切换连接UI。

您是否对与iOS 11的连接性有疑问? 我们的开发人员负责众多屡获殊荣的应用程序和连接设备的经验,并提供了答案。 通过hello@bottlerocketstudios.com告诉我们您想知道的事情。

最初于 2017年8月24日 发布在 www.bottlerocketstudios.com 上。