xcode 从iOS 15开始,iOS后台会话中的流请求上传速度变慢,x

pkbketx9  于 2023-05-01  发布在  iOS
关注(0)|答案(2)|浏览(259)

我正在开发一个应用程序,它使用iOS NSURLSession后台会话将数据上传到S3服务器。从iOS 15.x,我们观察到传输速度变得太慢(~10 kbps).
下面是配置,我正在使用
1.使用backgroundSessionConfigurationWithIdentifier创建NSURLSessionConfiguration
1.将HTTPMaximumConnectionsPerHost设置为8
1.将timeoutIntervalForRequest设置为60s
1.将timeoutIntervalForResource设置为86400s(1天)
1.将discretionary设置为false
1.将TLSMinimumSupportedProtocolVersion设置为tls_protocol_version_TLSv12
1.使用sessionWithConfiguration创建NSURLSession
1.使用uploadTaskWithRequest发送请求
当我用iPadOs 14.8.1测试时,性能没有下降,但是用iPadOs 15.3.115.5,我可以看到性能下降(上传速度变慢了6倍)。
当我使用ephemeralSessionConfiguration创建会话时,上传速度非常快,并且没有降级(像以前一样工作)。

对于所有测试,我只将应用程序保留在前台

我有几个疑问:

  1. iOS 15.x及更高版本的后台会话配置是否有任何更改?
    1.我们目前正在使用backgroundSessionConfigurationWithIdentifier创建后台会话。我们应该考虑迁移到iOS 13中引入的background tasks吗?
    1.是否由操作系统(在本例中为iOS)来调度请求,而我们(客户端)对传输速度没有控制或几乎没有控制?

**PS:**iOS模拟器也会出现降级。在模拟器的情况下,不知何故它依赖于macOS版本(从我的测试中可以看出)。

在macOs 12.4,xCode 13.2,iOS 12.x13.x14.x15.x模拟器显示性能下降。当同一个应用程序从macOS编译11.4,xCode 12.4,iOS 12.x13.x14.x没有显示任何性能下降。
任何投入都将受到高度赞赏。

nfzehxib

nfzehxib1#

模拟器可能只是将请求直接传递到macOS上的NSURLSession,因此模拟器的行为与macOS版本一致是有道理的。
这听起来像是macOS 12和iOS 15中的性能倒退。如果您还没有提交错误,请向反馈助手提交错误,并附上最低可重复的样本。
在我的脑海中,我想不出任何原因,你会看到一个短暂的和后台会话之间的可测量的性能差异,除非进程外的助手运行在一个太低的优先级。
后台任务和后台下载在某种程度上是正交的。前者在您的应用程序中运行,因此如果您的应用程序崩溃,它们将失败。后者在单独的进程中运行,因此它们独立于您的应用是否正在运行。后台下载更适合大型下载,特别是如果您的应用规模较大,因为这意味着iOS可以在不终止下载的情况下驱逐您的应用。
另一个明显的问题是,你是否曾经在后台启动过一项任务(例如:例如,响应于另一任务的完成)。后者很可能会受到限制,特别是如果您在后台上传或下载完成后开始新的传输。你可以通过合并资源并将它们上传到一个blob中来避免这种损失。例如zip文件)。从你的问题我假设你不是,但我只是想确定一下。:—)
我还假设这是通过Wi-Fi或网络不可知的,因为你也可以在macOS上看到它。
最后,我假设这不是HTTP/3(QUIC)问题。当然,这是iOS 15和macOS 12中NSURLSession最大的变化,所以如果我指责的话,这将是我的第一个嫌疑人。
我不知道这种或那种方式,但我可以很容易地看到苹果决定禁用该功能的短暂会话,因为它可能是或可能不是微不足道的,以避免存储cookie等。当您重用连接并并行发出多个请求时。
如果这就是问题所在,您可以看看是否有某种方法可以在服务器端或客户端禁用该功能。我不知道一个方法来做到这一点从我的头顶上,虽然。

mm5n2pyu

mm5n2pyu2#

我自己也曾与这个问题作过斗争,我想分享解决方案-为其他人,也为未来的我,当我再次遇到这个问题并不可避免地忘记时:要修复使用后台会话配置的上传的缓慢下载速度,请确保配置请求的网络服务类型-此设置适用于我:

var request = URLRequest(...)
// configure request
request.networkServiceType = .responsiveData

.responsiveAV也为我工作。请确保您只在上传及时发生很重要的情况下才设置此选项-如果不重要,只需将其交给后台会话并适当配置超时,然后让它继续进行。
注意:只有在应用程序处于前台时启动上传任务时,这才会产生影响。如果上传任务在应用程序已经在后台时开始(例如,您需要先执行一些其他工作,并延长后台执行时间,然后恢复上传任务),则它将忽略此情况,并表现为好像您已将其设置为.background,这将与之前一样慢,因为在后台启动的请求会受到严重限制。

相关问题