iOS应用前台启动的上传任务切后台时如何延长执行时间
问题解答
关于上传操作的放置位置
上传操作确实需要放在你标注的self.sendAppDataToServer( data: data)所在的位置,也就是beginBackgroundTask申请权限之后、endBackgroundTask结束权限之前的区间内。
beginBackgroundTask的作用是向系统申请额外的后台执行时间,只有在权限生效区间内的逻辑,才能在App退到后台后不被系统立即挂起,保证任务执行完成。如果把上传逻辑放到这个区间之外,App退后台后很快就会被冻结,上传会直接中断。
关于是否需要用Dispatch.global().sync { }包裹
不需要额外加这层包裹,原因如下:
- 示例代码外层已经用
DispatchQueue.global().async把整个逻辑放到了全局后台队列执行,没有必要再嵌套一层全局队列的同步任务,多余的嵌套反而可能带来不必要的线程阻塞风险。 - 代码中注释
// Send the data synchronously指的是上传任务本身要同步等待执行完成,再往下执行结束后台任务的逻辑,不是要求你用GCD的sync包裹。如果你本身用的是异步上传接口(比如URLSession的默认异步任务),可以用DispatchSemaphore等手段等待异步上传的回调返回(无论成功失败)后,再往下执行endBackgroundTask,否则会出现刚调用上传接口就直接结束了后台权限,系统直接收回执行权,上传依然会中断的问题。
补充注意事项
这种普通后台任务的执行时长是系统限制的,通常只有30秒到数分钟不等,如果是上传大文件的场景,更推荐使用URLSession的后台会话配置URLSessionConfiguration.background(withIdentifier:),这类任务由系统单独管理,就算App被挂起甚至被杀死,也能继续完成上传。
内容的提问来源于stack exchange,提问作者Curiosity
相关产品推荐
相关产品推荐

