IOS7 及以后的后台运行机制

iOS7前所支持的后台机制:

(1)使用beginBackgroundTaskWithExpirationHandler函数,向系统申请一段时间来执行需要后台运行的操作,这种方法的缺点是,后台操作最多只能运行10分钟,超过10分钟之后App会休眠。使用这种方法需要APPNAME-info.plist中设置Application does not run in background为NO,然后在适当的时间调用beginBackgroundTaskWithExpirationHandler函数。

 (2)将App的后台运行模式设置为audio 、VOIP、location、Newstand等。使用这种方法,可以无限制的在后台运行,以audio为例,将plist中的Required background modes项目设置为App plays audio or streams audio/video using AirPlay,并且在进入后台时播放无声音乐,就可以让App一直运行。这种方法的缺点是,如果使用不当,可能会被AppStore拒绝。因为审核时是可以通过静态分析知道使用了哪些API的,如果一个程序本来就不是音乐类的,却使用了播放音乐的API后台播音乐,有可能就被拒绝,如果想要绕过这个限制,可以向APP增加播放音乐的功能,但这样实际是增加了无用功能。


iOS7后增加的后台机制:  (一种是Background fetch ,另一种是Remote notification


1. Background fetch:  设置了这种后台方式之后,当App休眠之后,会隔一段时间被系统唤醒,从而执行一段短时间操作。唤醒的间隔由系统决定,App中可以设置[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];,但即使设置了,间隔也不确定是多少。另外,App被唤醒后,可以执行操作的时间也不长,文档上描述的30秒左右(实际上更长也可以,但是可能会降低以后被唤醒的几率)。


 2. Remote notification:在iOS7以前,当系统收到推送消息后,会立即弹出消息提示用户,用户点击消息之后,就可以启动App,然后加载数据。使用了这种新的后台模式之后,当系统收到推送消息之后,会唤醒App,给App一个机会执行一部分操作,等操作之后才提醒用户,而且还支持silent模式,即执行完操作之后,完全不对用户做任何提醒,默默的就在后台把活干完了。


ios7还增加了一下传输数据的方法,即Background Transfer service 

(1)Background Transfer service概述

      这种方法的名字很容易让人误解,以为是App进入后台时,使用这种方法进行数据传输。实际上,这种方法与后台无关。 当App使用了这种方法后,可以将一个下载任务交给系统的独立进程去下载,不管App在前台、休眠、以及crash,下载过程都在进行,因为是系统的独立进程在为App进行下载。当系统的下载任务结束或者出错时,系统会唤醒App,调用其中的函数,让App做一部分处理,比如让App重新添加其他任务。这里有一个缺点就是,如果因为没有网络导致系统下载失败了,系统即使唤醒了App,App也是没有办法下载的,然后App会进入休眠,即使后面有了网络,系统也不会继续下载,因为只要系统向App发出了失败的信号,除非App 调用resume函数来恢复下载过程,系统是不会自己恢复下载的。这里就需要用到前面提到的fetch后台模式,让App过一段时间被系统唤醒,然后App就可以去检查网络,当有网时恢复下载过程。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值