iOS端使用URLSession.uploadTask后台串行发送多请求相关问题咨询
iOS后台串行HTTP请求方案问题解答
问题1:能否使用URLSession.uploadTask发送常规HTTP请求?
可以。URLSessionUploadTask本质是苹果对带请求体的HTTP请求做的封装类,并没有限制只能用于文件上传:
- 对于普通POST请求,你可以把请求参数(JSON、表单数据等)序列化为
Data类型,调用uploadTask(with:from:)方法传入该Data即可 - 只需注意按照后端要求正确设置
Content-Type等请求头,请求效果和普通URLSessionDataTask的POST请求完全一致,且天然支持后台执行能力
问题2:后台执行完成触发代理时,能否在代理方法内启动下一个uploadTask实现全后台串行执行?
可以,但需满足以下前提:
- 你使用的必须是后台模式配置的URLSession,即通过
URLSessionConfiguration.background(withIdentifier:)初始化的实例,不能用默认的default/临时配置 - 当app处于后台时,uploadTask执行完成后系统会将app唤醒到后台活跃状态,触发
urlSession(_:task:didCompleteWithError:)代理回调,在该回调内创建并启动新的uploadTask是系统允许的操作 - 注意事项:
- 后台唤醒的执行时间窗口有限,不要在回调内执行无关耗时操作,仅做任务状态判断、下一个任务启动的逻辑即可
- 若app被系统主动杀掉,需在app重新启动时用相同的identifier重新创建后台URLSession,才能承接之前的任务回调、继续启动后续请求
问题3:使用URLSession.uploadTask实现4个请求全后台执行是否是合理方案?
是合理方案,且是苹果官方推荐的后台网络请求实现方式:
- 优势:
- 无需申请额外的后台运行权限,符合iOS系统后台运行规范
- 请求由系统进程接管调度,即使app被挂起、甚至被系统回收杀掉,请求依然会继续执行,稳定性远高于自行申请后台运行时间的方案(普通后台运行权限仅有3分钟左右的执行窗口,大文件上传很容易超时被挂起)
- 落地注意事项:
- 后台模式的URLSession不支持直接设置
URLRequest的httpBody属性,所有请求(包括2个普通POST请求)的请求体必须通过uploadTask的from:参数传入Data或本地文件地址 - 建议将串行请求的执行进度做持久化存储,避免app被意外杀掉后丢失执行状态,导致序列中断
- 需自行处理请求失败的重试、中断逻辑,系统只会负责执行任务,不会处理业务层面的串行调度逻辑
- 后台模式的URLSession不支持直接设置
内容的提问来源于stack exchange,提问作者Sayaki
相关产品推荐
相关产品推荐

