改变了后台任务的运行方式

  在iOS6和之前的系统中,系统在用户退出应用后,如果应用正在执行后台任务的话,系统会保持活跃状态直到后台任务完成或者是超时以后,才会进入真正的低功耗休眠状态。

  

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

  

  这个变化在不减少应用的后台任务时间长度的情况下,给设备带来了更多的休眠时间,从而延长了续航。对于开发者来说,这个改变更多的是系统层级的变化,对于非网络传输的任务来说,保持原来的用法即可,新系统将会按照新的唤醒方式进行处理;而对于原来在后台做网络传输的应用来说,苹果建议在iOS7中使用NSURLSession,创建后台的session并进行网络传输,这样可以很容易地利用更好的后台传输API,而不必受限于原来的时长,关于这个具体的我们一会儿再说。

后台获取(Background Fetch)

  现在的应用无法在后台获取信息,比如社交类应用,用户一定需要在打开应用之后才能进行网络连接,获取新的消息条目,然后才能将新内容呈现给用户。说实话这个体验并不是很好,用户在打开应用后必定会有一段时间的等待,每次皆是如此。

  iOS7中新加入的后台获取就是用来解决这个不足的:后台获取干的事情就是在用户打开应用之前就使app有机会执行代码来获取数据,刷新UI。这样在用户打开应用的时候,最新的内容将已然呈现在用户眼前,而省去了所有的加载过程。

  1、勾选Background Fetch。

  

  2、设定获取间隔。如果不对最小后台获取间隔进行设定的话,系统将使用默认值UIApplicationBackgroundFetchIntervalNever,也就是永远不进行后台获取。当然,-setMinimumBackgroundFetchInterval:方法接受的是NSTimeInterval,因此你也可以手动指定一个以秒为单位的最小获取间隔。

    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

  3、实现后台获取代码并通知系统。在AppDelegate里实现-application:performFetchWithCompletionHandler:。

   系统将会在执行fetch的时候调用这个方法,然后开发者需要做的是在这个方法里完成获取的工作,然后刷新UI,并通知系统获取结束,以便系统尽快回到休眠状态。应用在前台能完成的工作在这里都能做,唯一的限制是系统不会给你很长时间来做fetch,一般会小于一分钟,而且fetch在绝大多数情况下将和别的应用共用网络连接。这些时间对于fetch一些简单数据来说是足够的了,比如微博的新条目。

  4、通知系统获取完成。

  方法是调用-application:performFetchWithCompletionHandler:的handler。这个CompletionHandler接收一个UIBackgroundFetchResult作为参数,可供选择的结果有UIBackgroundFetchResultNewData,UIBackgroundFetchResultNoData,UIBackgroundFetchResultFailed三种,分别表示获取到了新数据(此时系统将对现在的UI状态截图并更新App Switcher中你的应用的截屏),没有新数据,以及获取失败。

 //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 != ) {
//Update UI with results.
//Tell system all done.
completionHandler(UIBackgroundFetchResultNewData);
} else {
completionHandler(UIBackgroundFetchResultNoData);
}
} else {
completionHandler(UIBackgroundFetchResultFailed);
}
}];
} else {
completionHandler(UIBackgroundFetchResultFailed);
}
}

  5、后台获取调试

    1) 新建Background Fetch Scheme。

    

    2)当应用在后台时,模拟一次后台获取。这个比较简单,在app调试运行时,点击Xcode5的Debug菜单中的Simulate Background Fetch,即可模拟完成一次获取调用。

参考:http://onevcat.com/2013/08/ios7-background-multitask/

最新文章

  1. 迷惑很久,仅以个人想法谈谈MVC架构,希望大家多给点意见
  2. MVC模式下向qq邮箱发送邮件
  3. Autofac.Integration.Owin
  4. [转载]对于GetBuffer() 与 ReleaseBuffer() 的一些分析
  5. 通过SQL语句提取存储过程中的内容
  6. Mysql创建函数时报错
  7. hhtml from表单为什么能提交数据
  8. 局部更新listview的问题(只更新某个item)
  9. WAJUEJI which home strong!
  10. C/C++中define的使用
  11. 炮塔郝梦主solo
  12. JAVA 发送邮件代码---发送HTML内容
  13. git pull冲突:commit your changes or stash them before you can merge.
  14. 解决Unable to find setter method for attribute: [commandName]
  15. php_类的定义
  16. 2018 ACM-ICPC World Finals B.Comma Sprinkler
  17. c++11の顺序容器
  18. Kong(V1.0.2)Network & Firewall
  19. checkbox、radio控件和文字不对齐
  20. Vuejs——(12)组件——动态组件

热门文章

  1. 浅谈 Gevent 与 Tornado(转)
  2. ZeroClipboard.js兼容各种浏览器复制到剪切板上
  3. linux下tengine安装
  4. VC++常规错误之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005
  5. struts2学习(2)struts2核心知识
  6. app测试笔记记录
  7. HDU 2201 熊猫阿波的故事
  8. Centos命令行窗口显示一大串前缀,777;notify;Command completed;的解决方法
  9. CentOS 修改IP地址为静态IP
  10. jquery内容补充