四种后台模式push notification 总结(另附送极光推送)

iOS 7 中, app 有四种后台运行模式 ,对应苹果的后台接口实现.

1. 无后台仅推送, 出现在 iOS 3.x 以下大部分系统版本, 表现为 按下 home 键就关闭退出,数据有 apple 的推送服务器传输,并不需要应用后台运行

这样做,每次退出后,重新进入都需要重新加载,重新请求下载,都需要耗费电量,而且用户体验不佳.

2.墓碑式后台,iOS 4后被大量采用,人称伪多任务,一进入后台就被冻结,无法操作

3.智能调度后台,就是 iOS 新增的 background fetch ,这个后台,会智能根据用户行为自动调整到效率最优的后台模式,能够处理不是很有时效性的信息获取background fetch 能够在后台提前 fetch 到 推送 ,并在 后台运行这个回调方法.

iOS系统便会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台获取频率和启动时长。

//通过极光推送的两张图,来比对一下 iOS 7 下多任务的优势



iOS 7 中的后台 fetch 部分


最后是后台的静默推送部分

推送消息携带 content-available: 1 是Background 运行的必须参数,如果不携带此字段则与iOS7 之前版本的普通推送一样。



4. 真后台机制:

1、Background Audio,这是后台的音频,这个很早之前便有,也是iOS设备中用得最多的后台应用,调用这个接口可以实现后台的音乐播放。

2、Location Services,这是后台的定位,系统会拥有统一页面进行管理。

3、VoIP,后台语音服务,类似Skype通话应用需要调用,可进行后台的语音通话。

4、Newsstand,报刊杂志后台自动下载更新,其能够自动实时更新。

5、Background Task  Completion,这个接口早在iOS 4时候便拥有,其可以供任意类型的APP使用,不过在旧系统中,这个接口的后台限制运行时间仅为10分钟,意味着当应用退至后台,其后台运行仅能持续10 分钟便会转至休眠状态。iOS 7中对这个接口作出了改变,原来的为连续10分钟,即不论你这10分钟内用户是否关闭屏幕进入休眠状态,应用仍然会在后台等待10分钟完结后推出,而新的 改进为假如遇到关闭屏幕休眠的情况,这后台运行的10分钟便会跟随一同休眠,剩余的后台时间将会留待用户再一次唤醒设备才计算。这样后台运行的时间仍然为 10分钟,但并不连续,这样做的优点为省电。

如现在有一些词典应用带有后台复制选词功能,实际上其是利用了这个接口,如果用户开启词典后并推出,即使屏幕关闭,但词典仍然在后台运行,电量消耗还是比较大的,在iOS 7上,这个问题可以得到解决。

6、 Remote Notification,这是本次较大的一个改进接口,以往聊天类应用接受推送后点进去需要再收一次信息,这情况在QQ、微信等应用上最为明显。不过拥有了这个接口后,这情况将不复存在,以后推送将能够直接启动后台任务。值得注意的是remote notification支持silent notification(静默推送),这样dropbox这类同步应用可以在后台以最节能的模式实时静默同步了,类似布卡漫画这种也可以推送正在追的漫 画的新章节并在后台静默下载,待到下载好再给用户发送一个本地推送,用户点开即看无需再联网

7、Background Transfer Service,后台上传下载。iOS最接近传统多任务的后台接口,可供任意类型的app调用,无时间限制。应用场景包括后台上传和下载数据,这使得游戏后台更新数据包,后台上传视频等等都成为可能,但是正如其名字,它只能用于处理上传下载这种传输类的任务,类似后台剪切板监控这种它就无能为力了。

//以下部分为转载总结

具体移步到 : http://blog.csdn.net/songhongri/article/details/11865391/

着重讲一下 Remote notification 中的问题

ios 7中的变化


iOS7中,后台任务的处理方式发生了改变。系统将在用户锁屏后尽快让设备进入休眠状态,以节省电力,这时后台任务是被暂停的。之后在设备在特定时间进行系统应用的操作被唤醒(比如检查邮件或者接到来电等)时,之前暂停的后台任务将一起进行。就是说,系统不会专门为第三方的应用保持设备处于活动状态。

可以看到 iOS 7 ,有一个所谓的心跳机会,特定的系统级应用的操作时,暂停的后台任务一起进行;这样做延长电池的续航时间, 带来更好的用户体验

实现后台获取代码并通知系统

在完成了前两步后,只需要在AppDelegate里实现-application:performFetchWithCompletionHandler:就行了。系统将会在执行fetch的时候调用这个方法,然后开发者需要做的是在这个方法里完成获取的工作,然后刷新UI,并通知系统获取结束,以便系统尽快回到休眠状态。获取数据这是应用相关的内容,在此不做赘述,应用在前台能完成的工作在这里都能做,唯一的限制是系统不会给你很长时间来做fetch,一般会小于一分钟,而且fetch在绝大多数情况下将和别的应用共用网络连接。这些时间对于fetch一些简单数据来说是足够的了,比如微博的新条目(大图除外),接下来一小时的天气情况等。如果涉及到较大文件的传输的话,用后台获取的API就不合适了,而应该使用另一个新的文件传输的API,我们稍后再说。类似前面提到的后台任务完成时必须通知系统一样,在在获取完成后,也必须通知系统获取完成,方法是调用-application:performFetchWithCompletionHandler:的handler。这个CompletionHandler接收一个UIBackgroundFetchResult作为参数,可供选择的结果有UIBackgroundFetchResultNewData,UIBackgroundFetchResultNoData,UIBackgroundFetchResultFailed三种,分别表示获取到了新数据(此时系统将对现在的UI状态截图并更新App Switcher中你的应用的截屏),没有新数据,以及获取失败。写一个简单的例子吧:

<span class="line-number" style="margin: 0px; padding: 0px;">1</span>
<span class="line-number" style="margin: 0px; padding: 0px;">2</span>
<span class="line-number" style="margin: 0px; padding: 0px;">3</span>
<span class="line-number" style="margin: 0px; padding: 0px;">4</span>
<span class="line-number" style="margin: 0px; padding: 0px;">5</span>
<span class="line-number" style="margin: 0px; padding: 0px;">6</span>
<span class="line-number" style="margin: 0px; padding: 0px;">7</span>
<span class="line-number" style="margin: 0px; padding: 0px;">8</span>
<span class="line-number" style="margin: 0px; padding: 0px;">9</span>
<span class="line-number" style="margin: 0px; padding: 0px;">10</span>
<span class="line-number" style="margin: 0px; padding: 0px;">11</span>
<span class="line-number" style="margin: 0px; padding: 0px;">12</span>
<span class="line-number" style="margin: 0px; padding: 0px;">13</span>
<span class="line-number" style="margin: 0px; padding: 0px;">14</span>
<span class="line-number" style="margin: 0px; padding: 0px;">15</span>
<span class="line-number" style="margin: 0px; padding: 0px;">16</span>
<span class="line-number" style="margin: 0px; padding: 0px;">17</span>
<span class="line-number" style="margin: 0px; padding: 0px;">18</span>
<span class="line-number" style="margin: 0px; padding: 0px;">19</span>
<span class="line-number" style="margin: 0px; padding: 0px;">20</span>
<span class="line-number" style="margin: 0px; padding: 0px;">21</span>
<span class="line-number" style="margin: 0px; padding: 0px;">22</span>
<span class="line-number" style="margin: 0px; padding: 0px;">23</span>
<span class="line-number" style="margin: 0px; padding: 0px;">24</span>
//File: YourAppDelegate.m
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController;

    id fetchViewController = navigationController.topViewController;
    if ([fetchViewController respondsToSelector:@selector(fetchDataResult:)]) {
        [fetchViewController fetchDataResult:^(NSError *error, NSArray *results){
            if (!error) {
              if (results.count != 0) {
                  //Update UI with results.
                  //Tell system all done.
                  completionHandler(UIBackgroundFetchResultNewData);
              } else {
                  completionHandler(UIBackgroundFetchResultNoData);
              }
            } else {
                completionHandler(UIBackgroundFetchResultFailed);
            }
        }];
    } else {
        completionHandler(UIBackgroundFetchResultFailed);
    }
}
后台任务的传输是由 NSURLSession 完成的,包括 iOS 9 中彻底放弃 NSURLConnection ,

关于 NSURLsession 的 原理可以看这篇:http://www.cocoachina.com/industry/20131106/7304.html

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW1


可以 看到当 app 处于后台的时候,配置对象的 discretionary 属性中会建立 Http 是长连接,异步下载数据

本文涉及到的WWDC2013 Session有

  • Session 204 What’s New with Multitasking
  • Session 705 What’s New in Foundation Networking

在iOS7之前,系统所接受的应用多任务可以大致分为几种:

  • 后台完成某些花费时间的特定任务
  • 后台播放音乐等
  • 位置服务
  • IP电话(VoIP)
  • Newsstand 
iOS 7 之后

  • 改变了后台任务的运行方式
  • 增加了后台获取(Background Fetch)
  • 增加了推送唤醒(静默推送,Silent Remote Notifications)
  • 增加了后台传输(Background Transfer Service)

一些限制

首先,后台传输只会通过wifi来进行,用户大概也不会开心蜂窝数据的流量被后台流量用掉。后台下载的时间与以前的关闭应用后X分钟的模式不一样,而是为了节省电力变为离散式的下载,并与其他后台任务并发(比如接收邮件等)。另外还需要注意的是,对于下载后的内容不要忘记写到应用的目录下(一般来说这种可以重复获得的内容应该放到cache目录下),否则如果由于应用完全退出的情况导致没有保存到可再次访问的路径的话,那可就白做工了。

后台传输非常适合用于文件,照片或者追加游戏内容关卡等的下载,如果配合后台获取或者静默推送的话,相信可以完全很多很有趣,并且以前被限制而无法实现的功能。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值