ios7新特性--11

来源:互联网 发布:ie11浏览器mac 编辑:程序博客网 时间:2024/05/29 04:15
前言:
本文由DevDiv社区@jas 版主原创翻译,转载请注明出处!
原文:http://www.shinobicontrols.com/b ... 3-background-fetch/

介绍
IOS7介绍了一些新的多任务接口。我们已经看到NSURLSession提供的一个守护进程在后台下载数据。另一个新的后台特性:即使应用没有运行的情况下,也可以获取更新的内容。这样的话,你的应用就可以获取到更新内容并启动,而不用通过网络通知。根据应用的使用情况,IOS系统会智能的管理这些后台获取事件,并节约用电。例如,你可能会检测到某个用户每天早上醒来的时候会去查看他的社交网络,这样你就可以在他醒来之前安排一个后台获取事件。
代码:
https://github.com/ShinobiControls/iOS7-day-by-day

开启后台获取功能
如果要使用后台获取功能,你需要注册一下。在Xcode5新的功能选项卡中:
1.png

另一件事情,你需要定义多久开启一次后台获取事件。如果你的信息只是一个小时更新一次,你就可以设置为1个小时开启一次。如果不确定,你可以使用下面推荐的值:

1- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2{   
3    // Set the fetch interval so that it is actually called
4    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
5 
6    return YES;
7}


注意:minimumBackgroundFetchInterval的默认值是 UIApplicationBackgroundFetchIntervalNever。所以如果开启后台获取,要设置这个属性。

实现
当后台获取事件执行的时候,IOS系统会启动应用并调用代理application delegate methodapplication: performFetchWithCompletionHandler:。应有会有一定的时间去获取数据并执行之前提供的completion handler block。

本文附带的项目是关于交通状况的应用。应用会接收路上交通状况的通知并显示在UITableView上。这个demo中,更新消息是随机生成的,可以下来table来刷新,方法如下:
1- (void)refreshStatus:(id)sender
2{
3    [self createNewStatusUpdatesWithMin:0 max:3 completionBlock:^{
4        [refreshControl endRefreshing];
5    }];
6}

调用的方法createNewStatusUpdatesWithMin:max:completionBlock::

01- (NSUInteger)createNewStatusUpdatesWithMin:(NSUInteger)min max:(NSUInteger)max completionBlock:(SCTrafficStatusCreationComplete)completionHandler
02{
03    NSUInteger numberToCreate = arc4random_uniform(max-min) + min;
04    NSMutableArray *indexPathsToUpdate = [NSMutableArray array];
05 
06    for(int i=0; i<numberToCreate; i++) {
07        [self.trafficStatusUpdates insertObject:[SCTrafficStatus randomStatus] atIndex:0];
08        [indexPathsToUpdate addObject:[NSIndexPath indexPathForRow:i inSection:0]];
09    }
10 
11    [self.tableView insertRowsAtIndexPaths:indexPathsToUpdate withRowAnimation:UITableViewRowAnimationFade];
12    if(completionHandler) {
13        completionHandler();
14    }
15 
16    return numberToCreate;
17}


随机更新时创建了一个随机数(使用SCTrafficStatus的类方法randomstatus,顾名思义,生成一个随机对象)。然后存储数据,刷新列表并调用completion handler。这是标准的列表代码,你可以增加列表来体现通过网络更新的信息。

通过后台获取来更新,我们需要在viewcontroller中添加下面的方法:
01- (NSUInteger)insertStatusObjectsForFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
02{
03    NSUInteger numberCreated = [self createNewStatusUpdatesWithMin:0 max:3 completionBlock:NULL];
04    NSLog(@"Background fetch completed - %d new updates", numberCreated);
05    UIBackgroundFetchResult result = UIBackgroundFetchResultNoData;
06    if(numberCreated > 0) {
07        result = UIBackgroundFetchResultNewData;
08    }
09    completionHandler(result);
10    return numberCreated;
11}


这个方法参数是app delegate后台获取方法中的completion handler,后面会看到。首先通过之前介绍的方法创建一些更新内容。当处理更新时,需要调用completion handler,告诉系统我们已经处理当前的内容了,可以接收新的信息了。方法返回值是之前创建的更新数值,并调用completion handler。completion handler是告诉系统我们已经处理当前信息了,如果合适的话,我们已经通过应用启动来显示更新了。
最后,app delegate需要实现这代理方法:
1- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
2{
3    // Get hold of the view controller
4    SCViewController *vc = (SCViewController *)self.window.rootViewController;
5    // Insert status updates and pass in the completion handler block
6    NSUInteger numberInserted = [vc insertStatusObjectsForFetchWithCompletionHandler:completionHandler];
7    [UIApplication sharedApplication].applicationIconBadgeNumber += numberInserted;
8}

现在,当通过后台获取启动应用时,应用将会通过view controller来更新数据并简单的刷新界面。

测试
目前我们还没有测试该代码,也没有明确的方法去模拟后台获取事件。Xcode5有这个特性,但是我们扔需要考虑2个问题:
1.应用目前在正在后台运行
要保证应用已经成功启动,并正在后台运行(也就是说,没有被终止)。Xcode提供一个新的调试方法去模拟这个,所以测试是非常简单的:开启程序,按home键,然后点击新的调试项:
2.png 

当调试的时候,建议在获取更新的方法中加入一些日志,来观察后台获取流程。本程序会更新桌面图标消息数。
2.应用已经终止
应用之前运行的,现在被用户或者IOS系统终止了。模拟这种场景,最简单的方式是去添加一个新的scheme。点击manage schemes,双击对应的scheme,编辑这个新的scheme,勾选后台获取选项:
3.png
现在,当你运行这个scheme的时候,你会发现模拟器启动了,但是应用没有加载。如果你在后台获取代理里面加了日志,现在就可以看到日志输出了。具体看工程里面的例子。

总结
后台获取以小的代价,增强用户体验。如果你的应用需要通过网络实时更新,那么后台获取是个非常简单的方式,它能保证你应用启动的时候拥有最新的信息
原创粉丝点击