iOS7中的多任务I

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

  在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中你的应用的截屏),没有新数据,以及获取失败。


 1 //File: YourAppDelegate.m
2 -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
3 {
4 UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController;
5
6 id fetchViewController = navigationController.topViewController;
7 if ([fetchViewController respondsToSelector:@selector(fetchDataResult:)]) {
8 [fetchViewController fetchDataResult:^(NSError *error, NSArray *results){
9 if (!error) {
10 if (results.count != 0) {
11 //Update UI with results.
12 //Tell system all done.
13 completionHandler(UIBackgroundFetchResultNewData);
14 } else {
15 completionHandler(UIBackgroundFetchResultNoData);
16 }
17 } else {
18 completionHandler(UIBackgroundFetchResultFailed);
19 }
20 }];
21 } else {
22 completionHandler(UIBackgroundFetchResultFailed);
23 }
24 }

  5、后台获取调试

    1) 新建Background Fetch Scheme。

    

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

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

时间: 2024-09-29 19:22:50

iOS7中的多任务I的相关文章

iOS7中的多任务 - Background Fetch,Silent Remote Notifications,?Background Transfer Service

转自:http://onevcat.com/2013/08/ios7-background-multitask/ 在IOS 7 出来不就,公司内部也组织了一次关于IOS 7 特性的的分享,今天看见onevcat 的blog,感叹它很有耐性和细心,写的这么详细,那就毫无保留原封不动的(其实也没有什么好改写的,实在是perfect )的分享给大家,希望对大家有所帮助. WWDC 2013 Session笔记 - iOS7中的多任务 iOS7的后台多任务特性 这是我的WWDC2013系列笔记中的一篇,

iOS7中的多任务II

[推送唤醒(Remote Notifications)] 在iOS6和之前,推送的类型是很单一的,无非就是显示标题内容,指定声音等.用户通过解锁进入你的应用后,appDelegate中通过推送打开应用的回调将被调用,然后你再获取数据,进行显示.这和没有后台获取时的打开应用后再获取数据刷新的问题是一样的. 在iOS7中这个行为发生了一些改变,我们有机会使设备在接收到远端推送后让系统唤醒设备和我们的后台应用,并先执行一段代码来准备数据和UI,然后再提示用户有推送.这时用户如果解锁设备进入应用后将不会

iOS7中计算UILabel中字符串的高度

iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category如下: UILabel+StringFrame.h ////  UILabel+StringFrame.h//  LabelHeight////  Copyright (c) 2014年 Y.X. All rights reserved.//#import <UIKit/UIKit.h>@interface UILabel (StringFrame)- 

iOS7中UIView的animateKeyframesWithDuration方法讲解

在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那就是animateKeyframesWithDuration 以下是使用源码: // // ViewController.m // // Created by YouXianMing on 14/11/26. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h"

iOS7中Cell高度 Label高度自适应

? 1 2 3 4 5 6 7 8 9 10 11 12 ?- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{     NSString *str = [_dataArray objectAtIndex:indexPath.row];     UIFont *tfont = [UIFont systemFontOfSize:14.0];     NSDictio

ios7中 丰富多彩的UIViewController之间的切换

转载自:http://onevcat.com/2013/10/vc-transition-in-ios7/ 毫无疑问,ViewController(在本文中简写为VC)是使用MVC构建Cocoa或者CocoaTouch程序时最重要的一个类,我们的日常工作中一般来说最花费时间和精力的也是在为VC部分编写代码.苹果产品是注重用户体验的,而对细节进行琢磨也是苹果对于开发者一直以来的要求和希望.在用户体验中,VC之间的关系,比如不同VC之间迁移和转换动画效果一直是一个值得不断推敲的重点.在iOS7中,苹

ios7中使用scrollview来横向滑动图片,自动产生偏移竖向的偏移 问题

ios7中使用scrollview来横向滑动图片,自动产生偏移竖向的偏移 问题 如图红色为scrollview的背景色,在scrollview上加了图片之后,总会有向下的偏移 设置contentOffset也不管用 在ios7中controller有个 automaticallyAdjustsScrollViewInsets属性,默认为YES if (iOS7&&[self respondsToSelector:@selector(automaticallyAdjustsScrollVie

iOS7中的状态栏

?从iOS7开始,系统提供了2种管理状态栏的方式 ?通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏) ?通过UIApplication管理(一个应用程序的状态栏都由它统一管理) ?在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式 ?状态栏的样式 - (UIStatusBarStyle)preferredStatusBarStyle

iOS7中Objective-C和Foundation的新特性

转自kingzwt2009的专栏 注意事项(Ray):文章来自iOS 7 by Tutorials  iOS 7Feast的一部分(略) Objective-C 是最重要的iOS和OSX apps的开发工具.你可以使用其他语言的第三方框架开发apps,例如HTML&Javascript或者C#,但是如果你很快的写出一个超炫的高效率的原声apps你就需要使Objective-C. Foundation 是你开发Objective-C应用时用到的核心框架之一. 作为一名iOS开发者,非常有必要了解最