我正在开发一个应用程序,该应用程序使用iOS NSURLSession后台会话将数据上传到S3服务器。从iOS15.x
,我们观察到传输速度变得太慢(~10 kbps)。
以下是配置,我正在使用
- 使用backgroundSessionConfigurationWithIdentifier创建
NSURLSessionConfiguration
- 将HTTPMaximumConnectionsPerHost设置为
8
- 将timeoutIntervalForRequest设置为
60s
- 将timeoutIntervalForResource设置为
86400s
(1天) - 将自由裁量设置为
false
- 将TLSMinimumSupportedProtocolVersion设置为
tls_protocol_version_TLSv12
- 使用sessionWithConfiguration创建
NSURLSession
- 使用uploadTaskWithRequest发送请求
当我使用iPadO14.8.1
进行测试时,性能没有下降,但使用iPadOs15.3.1
和15.5
时,我可以看到性能下降(上传速度慢了6倍)。
当我使用ephemeralSessionConfiguration创建会话时,上传速度非常快,没有降级(像以前一样工作)。
对于所有测试,我只将应用程序保留在前台。
我有几个问题:
- iOS
15.x
及更高版本的后台会话配置是否有任何更改 - 我们目前正在使用backgroundSessionConfigurationWithIdentifier创建后台会话。我们是否应该考虑转移到iOS 13中引入的后台任务
- 是由操作系统(在这种情况下是
iOS
)来安排请求,而我们(客户端)对传输速度没有控制还是控制很少
PS:iOS模拟器也在发生降级。在模拟器的情况下,不知何故,它依赖于macOs版本(从我的测试中可以看出)。
在maco12.4
上,在xCode13.2
中,iOS12.x
、13.x
、14.x
和15.x
模拟器显示出性能下降。当从maco11.4
编译同一应用程序时,xCode12.4
、iOS12.x
、13.x
、14.x
而不是显示任何性能下降。
如有任何意见,我们将不胜感激。
模拟器可能只是直接将请求传递给macOS上的NSURLSession,因此模拟器的行为与macOS版本一致是有道理的。
这听起来像是macOS 12和iOS 15中的性能回归。如果你还没有,请向反馈助手提交一个错误,并附上一个最低限度的可重复样本。
在我的脑海中,我想不出有什么原因会让你在短暂会话和后台会话之间看到可衡量的性能差异,除非进程外助手的优先级太低。
后台任务和后台下载在某种程度上是正交的。前者在你的应用程序中运行,所以如果你的应用崩溃,它们就会失败。后者在一个单独的进程中运行,因此它们与您的应用程序是否正在运行无关。后台下载更适合大型下载,尤其是当你的应用程序很大时,因为这意味着iOS可以在不终止下载的情况下驱逐你的应用。
另一个显而易见的问题是,你是否在后台开始了一项任务(例如,为了完成另一项任务)。后者可能会被抑制,尤其是当你在后台上传或下载完成后开始新的传输时。您可以通过组合资源并将其上传到单个blob(例如zip文件)中来避免这种惩罚。我从你的问题中假设你不是,但我只是想确定一下
我还假设这要么是通过Wi-Fi,要么是网络无关的,因为你也可以在macOS上看到它。
最后,我假设这不是HTTP/3(QUIC)问题。当然,这是iOS 15和macOS 12中NSURLSession的最大变化,所以如果我指指点点,那将是我的第一个怀疑。
我对此一无所知,但我很容易看到苹果决定为短暂会话禁用该功能,因为当你重复使用连接并并行发出多个请求时,避免存储cookie等可能很重要,也可能不是很重要。
如果是这个问题,您可能会看到是否有某种方法可以在服务器端或客户端禁用该功能。不过,我想不出有什么办法可以这么做。
我自己也遇到过这个问题,当我再次遇到这个问题时,我想分享这个解决方案——为其他人,也为未来的我——不可避免地忘记了:要使用后台会话配置修复上传的下载速度慢,请确保配置请求的网络服务类型——这个设置对我有效:
var request = URLRequest(...)
// configure request
request.networkServiceType = .responsiveData
.responsiveAV
也对我有用。请确保只有在上传及时进行很重要的情况下才设置此选项-如果不重要,只需将其交给具有适当配置的超时的后台会话,然后让它继续进行。
注意:只有在应用程序处于前台时启动上传任务,这才会产生影响。如果上传任务在应用程序已经处于后台时开始(例如,你需要先做一些其他工作,延长后台执行时间,然后恢复上传任务),那么它会忽略这一点,并表现得像你已经将其设置为.background
一样慢,因为在后台启动的请求会被严格限制。