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

推荐订阅源

F
Fortinet All Blogs
C
Check Point Blog
GbyAI
GbyAI
博客园 - 司徒正美
爱范儿
爱范儿
N
Netflix TechBlog - Medium
H
Hacker News: Front Page
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Latest
Security Latest
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - Franky
Recent Announcements
Recent Announcements
P
Privacy International News Feed
T
Tor Project blog
Y
Y Combinator Blog
有赞技术团队
有赞技术团队
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
G
GRAHAM CLULEY
The Hacker News
The Hacker News
N
News and Events Feed by Topic
I
Intezer
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
P
Proofpoint News Feed
Microsoft Security Blog
Microsoft Security Blog
IT之家
IT之家
T
Threat Research - Cisco Blogs
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
DataBreaches.Net
Hacker News - Newest:
Hacker News - Newest: "LLM"
Last Week in AI
Last Week in AI
H
Help Net Security
L
LangChain Blog
大猫的无限游戏
大猫的无限游戏
Help Net Security
Help Net Security
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Google Online Security Blog
Google Online Security Blog
Cyberwarzone
Cyberwarzone
T
Tailwind CSS Blog
V
Vulnerabilities – Threatpost
Forbes - Security
Forbes - Security
Apple Machine Learning Research
Apple Machine Learning Research
O
OpenAI News
AWS News Blog
AWS News Blog
月光博客
月光博客

isaced

使用 TypeScript 构建的 appstore-connect-sdk 归档 我用 SwiftUI 写了一个 V2ex 客户端 Docker 容器化多应用部署 Swift Server-side SDWebImage 为什么无法读取 webpmux 生成的 WebP 动图? [译] 探索 Swift 4 中新的 String API 对一个 Django 站点做 ab 压力测试 fir-mac 开发笔记 iOS10 Safari 引导用户信任企业签名 Swift Web 开发之 Vapor - 模版 Leaf(三) Swift Web 开发之 Vapor - 路由(二) HoloLens 初体验 Swift Web 开发之 Vapor - 入门(一) Jenkins for iOS 搭建日记 iOS HOOK 注入与重签名 Xcode 使用 Configuration 来配置不同的项目环境 图床从SAE迁移到七牛 给 UIProgressView 脱掉那层微弱的渐变 初用 CocoaAsyncSocket 记一次 SQLite 性能优化 有多色 - 开发小记 海岛风情 - 泰国普吉岛六日游 EGOCache 源码解析 日语五十音假名临摹校验算法 [iOS] UITextView 追加文字自动跳到顶部解决方法 Cocoa 新的依赖管理工具:Carthage 新年快乐! 博客主机换到搬瓦工 写了个iOS小游戏:有多色 悄悄的就必须用 XCode 5.1.1 上传了! HTTP Content-type 与 AFNetworking Objective-Cloud 初体验(1) 掌中站上架小记 NSLoger 上线了 Python Markdown 做语法限制 Nginx + Gunicorn + Django 部署小记 用Shell脚本批量裁剪App Icon各个尺寸 LaunchRocket使用小记 用宏提速NSCoding 2014新年伊始:近期读过的好文推荐 [iOS] stringWithFormat 和 initWithFormat 有何不同? Apache + Flask + mod_wsgi + Koding 部署小记 收集几个Objective-C的HTML解析库 NSMapTable: 不只是一个能放weak指针的 NSDictionary 2013,再见! Emlog到Typecho的迁移工具:emlog2typecho [iOS]给上拉下拉刷新PullToRefresh做本地化 [iOS]代码推荐:大图缩放视图 - Vertigo iOS:hidesBottomBarWhenPushed的正确用法 Xcode 5新的Interface Builder,你准备好了吗? [翻译]如何使用Django创建简单的博客 我的Mac音乐播放器 初识 NSDataDetector Objective-C 计算代码运行时间 WordPress上传文件自动重命名 iOS:仿jing.fm的音乐播放视图 我的啃黑苹果之路 关于 搜索 项目
iOS 后台任务之 Long-running background task
2014-07-23 · via isaced

最近项目里遇到需求需要 App 进入后台还能执行一些任务,于是便 Google 了一下,整理一篇小记录。

大家都知道 iOS 系统里,所有 App 进入后台的时候默认都是会暂停所有线程,等到再双击 Home 键回到前台才会继续执行。那有的场景需要在后台进行 upload、download,或者进行一些计算等等怎么办呢?

iOS7 推出了一些新的 API,让,那就是 NSURLSession ,就是为了取代前 NSURLConnection 而生,在我们常用的 AFNetworking 2.0 中也新增了对其的支持 (AFURLSessionManager/AFHTTPSessionManager) ,用 NSURLSession 可以很方便快速地进行一些后台的网络任务,很强大,网上资料也很多了,本文就不多提它了,后面也许会单独对 NSURLSession 后台任务专门写篇文章。

今天要介绍的是 long-running background task,“长时间运行后台任务”,中文应该是这个名字,当我们需要进入后台不暂停程序,就可以给系统说一声 “我需要在后台执行任务了哦~",然后你的 App 就不会被系统挂起,准确来说是延迟暂停,注意这是全局的,意思就是 App 里所有东西都将正常执行,就跟在前台一样。不过系统给你这个权限的时间是有限的。

Begin

首先我们需要定义一个 UIBackgroundTaskIdentifier 对象,噢,Command 点进去居然是个NSUInteger

    UIBackgroundTaskIdentifier myTask;

然后有两个方法来开始后台任务,都是在 UIApplication 里,可以看到第二个方法可以传一个 taskName 参数,而且是 iOS7 新增的。(原来 iOS4.0 就支持了~) 在 Apple 的文档里是这么介绍的:

Marks the beginning of a new long-running background task.

- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void(^)(void))handler  NS_AVAILABLE_IOS(4_0);
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(NSString *)taskName expirationHandler:(void(^)(void))handler NS_AVAILABLE_IOS(7_0);

好,那我们来开始一个后台任务:

    myTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        // 后台任务到期执行,好像是10分钟
    }];

执行上面这句话后,当你的 App 再次进入后台时就不会被马上暂停了。但是我们不能滥用这个,为了自己的 App 负责,也为用户的 iPhone 负责,关键是滥用的话 App Store 审核那也过不去的…

Stop

所以,有开就有关:

    [[UIApplication sharedApplication] endBackgroundTask: myTask];
    myTask = UIBackgroundTaskInvalid;

另外 UIApplication 还提供两个个属性 backgroundTimeRemaining backgroundRefreshStatus,可自行研究…


注:关于这个时间问题,笔者也有些不解,在测试的时候 ExpirationHandler 会在 180 秒左右,也就是 3 分钟的时候触发,但后台任务还是在继续。求大神解惑!


参考文章: