惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
S
Security @ Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
博客园 - 司徒正美
雷峰网
雷峰网
L
LINUX DO - 最新话题
博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
The Last Watchdog
The Last Watchdog
V2EX - 技术
V2EX - 技术
S
Security Affairs
有赞技术团队
有赞技术团队
月光博客
月光博客
T
Threatpost
T
Tor Project blog
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
V2EX
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
博客园 - 三生石上(FineUI控件)
D
Docker
AWS News Blog
AWS News Blog
AI
AI
P
Proofpoint News Feed
K
Kaspersky official blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Securelist
F
Fortinet All Blogs
F
Full Disclosure
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
量子位
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Palo Alto Networks Blog
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
美团技术团队
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
MyScale Blog
MyScale Blog

博客园 - 幻化成疯

今天又是一年的最后一个工作日 今天是最后一个工作日 过年了,龙年 新年又来了!今天是放假的最后前的最后一个工作日! Vue开发时运行npm install命令导致npm包自动升级而引起bug iOS AppIcon透明圆角导致的动画问题 iOS14 毛皮玻璃Blur效果英文教程推荐 iOS14 SceneKit Camera 的视角 Swift5 的 Enum iOS14 Core Location后台定位 用.Net 开发Windows Service ,合并dll到exe中 iOS SpriteKit 字体设置无效问题 2021又来到了! Dart 和 Javascript 中的await 和 async的理解 iOS12 判断网络链接状态NWPathMonitor 又离职了~ 留个纪念,过了这么多年,又干回Android了! mac上运行shell脚本遇到回车字符错误 - 幻化成疯 - 博客园 以iphone作为热点时ios程序中的UDP广播地址
iOS12 中的后台下载与上传
幻化成疯 · 2019-05-25 · via 博客园 - 幻化成疯

严格意义上来说,iOS并不能像Android一样,真的在后台开启一个下载Service,一直下载。但是它可以进行在系统允许范围内的后台上传和下载。
当使用

NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];
 NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:self.operationQueue];

创建一个Session后,由此Session创建出的NSURLSessionDownloadTask 和 NSURLSessionUploadTask 都会被交给系统的Background Transfer Services负责上传下载。 这种方法创建的task,不支持block形式的创建方法,必须使用比较原始的delegate回调方式。而且目前NSURLSessionDataTask对background模式的支持不好,切入后台后, 没有任何系统回调函数, 过一段时间再把程序切入前台直接报错。至于原因,有如下帖子说明:

https://stackoverflow.com/questions/39639268/ios-background-task-using-nsurlsessiondatatask

其中的主要意思是,NSURLSessionDataTask是把数据保存在内存中的,而Background Transfer Services无法跨进程读取内存数据。但是实际上,官方文档并没有说明DataTask不支持后台模式,很可能是目前的iOS版本里存在bug。

官方推荐的使用方法是在一个Session中,直接将需要处理的任务全部开启,程序进入后台,这些任务全部下载完成后,系统会通知程序。这种模式很适合下载的Url数量很少的情况,比如只需要下载几个url中的数据。但是如果需要下载几十个或是上百个url的资源,我们就不能一下子发起那么多的请求,服务器很可能无法及时响应,导致请求超时出错。那么想要达到后台下载的效果,就需要把众多请求分组放入多个Session,一个Session中的所有下载完成后,系统回产生回调,我们在系统回调中再次开启新的Session,继续下载。