项目里遇到需求须要App进入后台还能执行一些任务,因而便Google了一下,整理一篇小记录。css
你们都知道iOS系统里,全部App进入后台的时候默认都是会暂停全部线程,等到再双击Home键回到前台才会继续执行。那有的场景须要在后台进行upload、download,或者进行一些计算等等怎么办呢?html
iOS7推出了一些新的API,让,那就是 NSURLSession
,就是为了取代前 NSURLConnection
而生,在咱们经常使用的 AFNetworking 2.0
中也新增了对其的支持 (AFURLSessionManager/AFHTTPSessionManager) ,用 NSURLSession
能够很方便快速地进行一些后台的网络任务,很强大,网上资料也不少了,本文就很少提它了,后面也许会单独对 NSURLSession 后台任务专门写篇文章。ios
今天要介绍的是 long-running background task
,"长时间运行后台任务",中文应该是这个名字,当咱们须要进入后台不暂停程序,就能够给系统说一声 "我须要在后台执行任务了哦~",而后你的 App 就不会被系统挂起,准确来讲是延迟暂停,注意这是全局的,意思就是 App 里全部东西都将正常执行,就跟在前台同样。不过系统给你这个权限的时间是有限的。网络
首先咱们须要定义一个 UIBackgroundTaskIdentifier
对象,噢,Command 点进去竟然是个NSUInteger
,app
UIBackgroundTaskIdentifier myTask;
而后有两个方法来开始后台任务,都是在 UIApplication
里,能够看到第二个方法能够传一个taskName参数,并且是iOS7新增的。(原来 iOS4.0 就支持了~)
在 Apple 的文档里是这么介绍的:ide
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);
好,那咱们来开始一个后台任务:ui
myTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ // 后台任务到期执行,好像是10分钟 }];
执行上面这句话后,当你的 App 再次进入后台时就不会被立刻暂停了。可是咱们不能滥用这个,为了本身的App负责,也为用户的 iPhone 负责,关键是滥用的话 App Store 审核那也过不去的...url
因此,有开就有关:spa
[[UIApplication sharedApplication] endBackgroundTask: myTask]; myTask = UIBackgroundTaskInvalid;
另外 UIApplication
还提供两个个属性 backgroundTimeRemaining
和backgroundRefreshStatus
,可自行研究...
注:关于这个时间问题,笔者也有些不解,在测试的时候 ExpirationHandler 会在 180 秒左右,也就是 3 分钟的时候触发,但后台任务仍是在继续。求大神解惑!
参考文章: