iOS 后台任务之 Long-running background task

项目里遇到需求需要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 分钟的时候触发,但后台任务还是在继续。求大神解惑!



参考文章:

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

时间: 2024-10-19 20:06:41

iOS 后台任务之 Long-running background task的相关文章

UWP -- Background Task 深入解析

原文:UWP -- Background Task 深入解析 1. 重点 锁屏问题 从 Windows 10 开始,用户无须再将你的应用添加到锁屏界面,即可利用后台任务,通用 Windows 应用必须在注册任何后台触发器类型之前调用 RequestAccessAsync: await BackgroundExecutionManager.RequestAccessAsync(); 资源限制 由于对于内存较低的设备的资源约束,后台任务可能具有内存限制,该限制决定了后台任务可以使用的内存上限 在内存

flutter 卡在Running Gradle task 'assembleDebug'...

Android项目运行时出错 卡在Initializing gradle… 运行时会卡在Initializing gradle..., 此时因为Android项目会用到Gradle, 如果没有FQ,下载速度会非常慢, 此时我们可以在项目中的android/gradle/wrapper/gradle-wrapper.properties中查看gradle版本号以及地址, 我们可以手动下载然后解压到~/.gradle/wrapper/dists/中. 卡在Running ‘gradle assemb

flutter 之Waiting for another flutter command to release the startup lock...和Running Gradle task 'assembleDebug'... 卡住

看了网上很多解决办法,一般是找到fluttersdk的bin的cache目录下的lockfile然后删掉 然鹅...正常情况下一般不会让你删,一般显示有进程占用... 于是换了种思维,发现在win下每次运行flutter,git-remote都要发送次请求,目的的是GitHub 处于天朝,我是移动网络,所以上GitHub速度非常慢,而每次这个git-remote都要接受1.33m才会进行下一个动作 如果不断开,快的时候10几秒搞定,慢的时候直接卡死, 如果ctrl+c结束再运行也是没用 尝试去直

ios background task

今天要实现一个需求,当用户触摸HOME键,将应用切换到后台时,启动自动备份的任务.这涉及到ios的后台任务处理,本文简单总结一下 首先,ios app有5种状态,分别是:not running, inactive, active, background, suspended,详情请看官方的guide: apple guide 机制 如果应用处于background状态,又希望它继续做一些事的话,ios提供了几种途径: 推送 苹果提供的PUSH机制,叫APNS.腾讯的QQ和微信就是使用这种方式.实

IOS后台任务

http://onevcat.com/2013/08/ios7-background-multitask/ IOS提供了以下多中方式处理后台任务 1:beginBackgroundTaskWithExpirationHandler 2:特定任务的后台处理 3:后台获取 4:推送唤醒 5:后台传输 其中后面3种方式IOS7之后才支持 beginBackgroundTaskWithExpirationHandler - (BOOL)application:(UIApplication *)appli

iOS 后台任务

首先开启后台任务 使用设置后台任务触发的时机 application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum) func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult)

cocos2d-x 3.15(lua) 在Xcode8.2+下模拟器运行崩溃问题 iOS simulator crash when running cocos2d-x 3.15 lua project on Xcode8.2+

问题描述: 在Xcode8.3.3下通过iOS模拟器运行cocos2d-x3.15lua版本的工程,会出现崩溃,某些版本模拟器会提示: error: memory read failed for 0x0 搜索期间发现该问题在Xcode8.2也会出现. 解决思路: 通过搜索,问题最终导向了这个issue,在这个issue中提出了两个解决方案: 通过这个工程去编译最新的libluajit.a并替换现工程中同名库 直接从这里直接拿libluajit.a并替换现工程中同名库

how to run a continuous background task on OpenShift

https://stackoverflow.com/questions/27152438/best-way-to-run-rails-background-jobs-with-openshift https://stackoverflow.com/questions/26818574/my-python-script-hosted-on-openshift-inside-the-openshift-cron-minutely-directo https://www.reddit.com/r/Py

Grunt Error in linux: Running "watch" task Waiting...Warning: watch ENOSPC

方法1.执行npm dedupe 方法2.ubuntu echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p archlinux add fs.inotify.max_user_watches=524288 to /etc/sysctl.d/99-sysctl.conf and then execute sysctl --system