iOS后台模式BackgroundMode
概述
iOS平台提供给应用特殊的后台服务,应用在后台时仍被允许能执行一会。
后台模式
UIBackgroundModes Xcode Modes
1. audio -> Audio.Airplay and Picture in Picture: 应用在后台时可以播放声音信息 应用场景:需要在后台播放音频
2. location -> Location updates: 应用提供位置信息 应用场景:在后台时需要不断通知用户位置更新信息
3. voip -> Voice over IP: 提供Voice-over-IP服务。 如skype网络电话
4. fetch -> Background fetch: 应用场景:需不断地频繁的基于一定规律从网络上获取新的数据 supported in iOS 7.0
5. remote-notification 应用场景:通过远程推送作为一个信号表明有新的数据需要下载,以尽可能减少用户直接点开通知后查看内容的等待时间 supported in iOS7.0
6. newsstand-content 在后台时使用Newsstand框架(杂志)进行数据的下载更新 supported in iOS5.0 and later
7. external-accessory 有规律的从固件获取信息,可以在后台不断的与外设进行沟通 supported in iOS 5.0 and later
一些外设控制App,比如一些控制第三方MFi配件的应用,开启后可让应用不断的与外设进行沟通
8. bluetooth-central -> Uses Bluetooth LE accessories 需要在后台不断更新蓝牙状态 CoreBluetooth supported in iOS 5.0 and later
9. bluetooth-peripheral -> Acts as a Bluetooth LE accessory 需要在后台不断访问其他蓝牙设备获取数据 supported in iOS 6.0 and later
后台执行场景
官方为我们界定了 3 类后台执行任务的场景:
- Background Tasks:APP 在前台时启动某项任务,然后在未结束之前突然 切换到了后台,那么 APP 可以在切换回调里使用某些 API 来继续向系统请求一些时间来继续完成这个任务;完成之后通知系统,之后系统会将 APP 挂起;
- Downloading:在后台启动从网络下载文件的任务 – 对于文件下载,iOS 有专门的机制;
- Specific Backgournd Tasks:应用需要在后台一直执行代码;
Background Tasks
使用 API beginBackgroundTaskWithExpirationHandler来指定.执行过程中 APP 被切换到后台时,任务还没有完成,这个时间又会自动调整为一个时间片段(具体多少我没找到文档说明,都是说可以通过backgroundTimeRemaining 属性得到)。对于一个固定 task ,每次调用beginBackgroundTaskWithExpirationHandler,都会产生一个 token 值(UIBackgroundTaskIdentifier 实际是个整型),必须在任务执行结束时,调用 endBackgroundTask 并传递这个 token,来结束后台任务。另外,作为最佳实践,都应该传递一个 超时 handler,以防申请到的时间片段内,还是没能完成任务的话,做最后的清理和标注工作!如果不传的话,那么结果就是 iOS 直接 kill 掉你的APP
doc and code from : iOS 后台任务设计指导
// 在某处定义一个 token 变量
UIBackgroundTaskIdentifier _bgTaskToken;
// 进入后台 委派方法回调
- (void)applicationDidEnterBackground:(UIApplication *)application
{
_bgTaskToken = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
// 时间到了,任务还没完成,只能清理
...
// 取消后台任务
[application endBackgroundTask:_bgTaskToken];
_bgTaskToken = UIBackgroundTaskInvalid;
}];
// 异步启动任务,这样不会阻塞 本委派方法回调
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 巴拉巴拉,做自己的任务
...
// 任务在时间限制内结束啦,取消后台任务
[application endBackgroundTask:_bgTaskToken];
_bgTaskToken = UIBackgroundTaskInvalid;
});
}
Apple Doc
Tracking the User’s Location
有三种方式来实现 位置的访问:
- The significant-change location service(这也是官方推荐的方式)
- Foreground-only location services
- Background location services
The significant-change location service ,字面理解,就是只有位置有变化时才会发出通知,有人说这个时机是依据基站,切换了基站时,就会发出一次通知,所以频率会受基站的密度影响,所以市区更新频率会比郊区高。但好处 是这个服务不管你的 APP 是在前台还是后台,不管是否已经被挂起,或已经死掉了,他都会唤醒你的进程进行相应处理,所以应该是最省电的
Communicating with an External Accessory
外设设备有很多,比如一些心率监控器,会在必要的时候向手机推送数据。系统替 APP 监视这个连接,但有数据过来时,会唤醒 APP 进行处理,每次唤醒 APP 只有 10 S进行数据处理,如果10S不够,需要使用 beginBackgroundTaskWithExpirationHandler: 方法再申请一段时间进行处理;
【Note】:Apple 要求此类应用 需要提供一个 开启 和 关闭 连接的界面供用户使用;
Using Push Notifications to Initiate a Download
服务端推送的通知内容里加入 键值对 content-available = 1 ,那么 手机收到这个通知后,会自动启动 APP 到后台,或 唤醒(依旧保持后台执行),并回调 委托方法application:didReceiveRemoteNotification:fetchCompletionHandler:
Reference
App Programming Guide for iOS - Background Execution
iOS 后台任务设计指导
iOS后台模式BackgroundMode的更多相关文章
- 对iOS后台模式最多10分钟运行时间的进一步理解
在app进入后台时,系统初始默认是只有10s的处理时间,但如果10s不够,我们可以主动申请,网上流传最多的一个说法是10分钟. 但这种说法有个前提: 那就是iOS7之前,是这样 但从iOS7开始,我们 ...
- ios 后台模式
1.在后台可以继续播放音频 To play sound in the background, make sure to add the following to the Info.plist file ...
- 关于iOS后台模式
https://onevcat.com/2013/08/ios7-background-multitask/ http://zhidao.baidu.com/link?url=NUOMrLGB6Odr ...
- ios xmpp开发应用后台模式接收聊天信息处理方案
ios xmpp开发应用后台模式接收聊天信息 最近在使用xmppframwork来实现一个聊天应用,碰到了一个问题,应用进入后台以后,就接收不到消息了: 怎么样才能使应用被切到后台时,应用中的网络连接 ...
- iOS之本地推送(前台模式与后台模式)
#import "AppDelegate.h" #import "GlobalDefine.h" @interface AppDelegate () @end ...
- 关于iOS后台问题( 一 )(ios后台刷新,后台定位,后台下载,真后台)
关于iOS的后台,以下引用一些文段进行一下脑补,请同学们大致看一下,有个基础,原文出处 -------------------------------------------------------- ...
- iOS后台定位,实时向服务器发送最新位置
第一步,开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: Past ...
- iOS后台定位实现
iOS后台定位实现 (2013-01-24 16:43:12) 工作中碰到一个定位的应用场景:app需要在后台运行,实时上传用户地理位置. 苹果对iOS的规范性在提升了app的品质的同时也 ...
- ios 后台下载,断点续传总结
2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...
随机推荐
- 按字节寻址and按字编址
按字节寻址,存储空间的最小编址单位是字节,按字编址,存储空间的最小编址单位是字,最小编址单位的选择,和存储容量.地址总线宽度都有关联 .同样的存储容量, 粒度小了,地址长度就需要更长 .就是根据不同的 ...
- Servlet的部署开发细节以及注意事项
学习servlet最困难的我感觉还是配置,一開始是非常麻烦的.为了较好的学习,一開始还是以手动开发我认为比較好,可是真的有点把握给搞晕了,尤其是部署servlet方面非常麻烦,这里做一下简单的总结,前 ...
- javascript 复制粘贴操作
function CopyCode(key){ var trElements = document.all.tags("tr");//获取tr元素 var i; for(i = 0 ...
- FastDFS的配置、部署与API使用解读(4)FastDFS配置详解之Client配置(转)
一种方式是通过调用ClientGlobal类的初始化方法对配置文件进行加载,另一种是通过调用API逐一设置配置参数.后一种方式对于使用Zookeeper等加载属性的方式很方便. 1. 加载配置文件: ...
- apk程序查找方法调用
有android killer,现在ida对android的支持等一些方便工具,此篇(关于搜索和修改代码)废弃. 没有好的调试工具下 常用插代码(如果怕影响寄存器值,可以将.locals xxx改多几 ...
- CAShapeLayer的使用
CAShapeLayer的使用 1.CAShapeLayer 简介 1.CAShapeLayer继承至CALayer,可以使用CALayer的所有属性值 2.CAShapeLayer需要与贝塞尔曲线配 ...
- CSS3 弹性盒子(Flex Box) 微信小程序图片通栏
{{define "chkUrl"}} <!DOCTYPE html><html lang="zh-cmn-Hans"><head ...
- XFire WebService demo
XFire创建WebService实例应用 XFire使得在JavaEE应用中发布Web服务变得轻而易举.和其他Web服务引擎相比, XFire的配置非常简单,可以非常容易地和Spring集成. ...
- SQL Server 2012 安装图解教程(附sql2012下载地址)
在安装微软最新数据库SQL Server 2012之前,编者先确定一下安装环境:Windonws 7 SP1,32位操作系统.CPU是2.1GHz赛扬双核T3500,内存2.93GB. sql2012 ...
- POJ1459 Power Network —— 最大流
题目链接:https://vjudge.net/problem/POJ-1459 Power Network Time Limit: 2000MS Memory Limit: 32768K Tot ...