iOS 7 SDK: 如何使用后台获取(Background Fetch)

来源:互联网 发布:帝国时代3德国打法知乎 编辑:程序博客网 时间:2024/06/14 13:27

 本文主要教你如何使用iOS 7 SDK多任务处理API--Background Fetch。我们生活在一个社交化的世界中,大部分用户都安装了几个社交类app,但是每次用户打开app,他们必须要等待app加载更新才能看到跟更多最新的内容,对于越来越没耐心的用户来说这一点无疑令人非常痛苦。现在,iOS 7的后台获取(Background Fetch)可以很好地解决这个问题,在用户打开应用之前,app就能自动更新获取内容。

 
以检测流量的app为例来说明Background Fetch如何工作。如果你会在每天早上查看应用,我们假设在8:20 AM,,你的iOS app必须在当时获得信息。现在如果操作系统知道你将会在8:20 AM左右使用app,那么它可以提前获得数据,从而提供更好的用户体验。
 
关于iOS 7多任务执行更全面的概览可参看我们的主题“iOS 7 SDK: Multitasking Enhancements”。以下我们将会以一个实例工程来演示如何使用后台获取(Background Fetch)。
 
1.项目安装
第一步是创建一个iOS 7项目,并选择单视图app,接着添加一些有用的属性:
  1. @property (nonatomic) NSMutableArray *objects; 
  2. @property (nonatomic) NSArray *possibleTableData; 
  3. @property (nonatomic) int numberOfnewPosts; 
  4. @property (nonatomic) UIRefreshControl *refreshControl; 
 NSMutablearray对象将会被用来在TableView中保存对象列表。在这个教程中,你将不能调用任何服务来获得数据。相反,你将使用possibleTableData数组,并随机从中选择几个对象。整个numberOfnewPosts代表新发布的内容--每次进行请求或者接收后台获取时可用。refrestControl是一个在更新任务时使用的控件。由于不在教程之内,所以本文不会在此展开。
 
在Main.storyboard中,把ViewController改为UITableViewController,下一步,点击UITableViewController,转到Editor > Embed in > Navigation Controller。记得把自定义类设置为ViewController。然后转至ViewController.m,第一步加载一些数据。以下代码将会申请内存并创建数据对象,创建一个标题以及初始化refreshControl:
  1. self.possibleTableData = [NSArray arrayWithObjects:@"Spicy garlic Lime Chicken",@"Apple Crisp II",@"Eggplant Parmesan II",@"Pumpkin Ginger Cupcakes",@"Easy Lasagna", @"Puttanesca", @"Alfredo Sauce", nil]; 
  2. self.navigationItem.title = @"Delicious Dishes"
  3. self.refreshControl = [[UIRefreshControl alloc] init]; 
  4. [self.refreshControl addTarget:self action:@selector(insertNewObject:) forControlEvents:UIControlEventValueChanged]; 
  5. [self.tableView addSubview:self.refreshControl]; 
 
以上代码将会产生一个提醒,因为我们丢失了insertNewObject method。让我们来解决它。该方法将会产生一个随机数,并且将从日期数组获得对象相同的数据,然后它将会通过新值来更新tableview。
  1. - (void)insertNewObject:(id)sender 
  2.     self.numberOfnewPosts = [self getRandomNumberBetween:0 to:4]; 
  3.     NSLog(@"%d new fetched objects",self.numberOfnewPosts); 
  4.     for(int i = 0; i < self.numberOfnewPosts; i++){ 
  5.         int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)]; 
  6.         [self insertObject:[self.possibleTableData objectAtIndex:addPost]]; 
  7.     } 
  8.     [self.refreshControl endRefreshing]; 
当你添加以下方法时,getRandomNumberBetween提醒将会被禁止:
  1. -(int)getRandomNumberBetween:(int)from to:(int)to { 
  2.     return (int)from + arc4random() % (to-from+1); 
 为了在 NSArray object上加载对象,我们需要执行TableView委托函数。
  1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
  2.     return 1; 
  3. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
  4.     return self.objects.count; 
  5. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
  6.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
  7.     cell.textLabel.text = self.objects[indexPath.row]; 
  8.     if(indexPath.row < self.numberOfnewPosts){ 
  9.         cell.backgroundColor = [UIColor yellowColor]; 
  10.     } 
  11.     else 
  12.         cell.backgroundColor = [UIColor whiteColor]; 
  13.     return cell; 
非常简单吧?如果运行项目,你会看到一个类似下图的界面:
2. Background Fetch
现在开始创建Background Fetch功能,首先从Project开始,接着是Capabilities,然后Put Background Modes ON,再选择Background Fetch,如下图所示:
但仅仅做这个是不够的。默认地,app不会调用后台API,所以你需要在AppDelegate.m文件中把以下代码添加至-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method.
  1. [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; 
这个可以让系统决定何时应该展示新内容。现在你的app已经知道启动ackground fetch,让我们告诉它要做些什么。方法-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler将会对你有所帮助。每当执行后台获取时该方法都会被调用,并且应该被包含在AppDelegate.m文件中。以下是完整版本:
 
  1. -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
  2.     UINavigationController *navigationController = (UINavigationController*)self.window.rootViewController; 
  3.     id topViewController = navigationController.topViewController; 
  4.     if ([topViewController isKindOfClass:[ViewController class]]) { 
  5.         [(ViewController*)topViewController insertNewObjectForFetchWithCompletionHandler:completionHandler]; 
  6.     } else { 
  7.         NSLog(@"Not the right class %@.", [topViewController class]); 
  8.         completionHandler(UIBackgroundFetchResultFailed); 
  9.     } 
下一步你应该也把ViewController头文件放进AppDelegate.m类。
  1. #import "ViewController.h" 
注意insertNewObjectForFetchWithCompletionHandler并没有被创建,所以还需要在ViewController.h中声明它。
 
  1. - (void)insertNewObjectForFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; 
现在关注执行文件,类似于之前insertNewObject调用的添加。我们使用completionHandler来和系统“交流”,并让它告诉我们app是否现在获取数据,或者当前是否有有效数据。
  1. - (void)insertNewObjectForFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
  2.     NSLog(@"Update the tableview."); 
  3.     self.numberOfnewPosts = [self getRandomNumberBetween:0 to:4]; 
  4.     NSLog(@"%d new fetched objects",self.numberOfnewPosts); 
  5.     for(int i = 0; i < self.numberOfnewPosts; i++){ 
  6.         int addPost = [self getRandomNumberBetween:0 to:(int)([self.possibleTableData count]-1)]; 
  7.         [self insertObject:[self.possibleTableData objectAtIndex:addPost]]; 
  8.     } 
  9.     /* 
  10.      At the end of the fetch, invoke the completion handler. 
  11.      */ 
  12.     completionHandler(UIBackgroundFetchResultNewData); 
完成代码,现在我们模拟一个测试,并验证所有项目都能启动和运行。
 
3. Simulated Background Fetch
如果想确定是否每件事都已经配置好了,你需要编辑Schemes,在Schemes列表点击Manage Schemes选项,如下:
 
在Schemes管理区你可以复制app的scheme:
 
复制后scheme会在新窗口展示。你可在Options标签下更改它的名称。选择“Launch due to a background fetch event”框,并在所有窗口中点击“OK”。
 
接着,使用复制的scheme运行app。注意app不会在前台打开,但是它应该已经获得了一些内容。如果打开app,并且几个recipe已生效,那就说明操作已经成功了。为了使用后台获取功能,你也可以从Xcode菜单的Debug > Simulate Background Fetch开始。
 
源文件下载:
/cms/uploads/soft/131113/4673-131113193430.zip
 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 睫毛掉进眼睛里怎么办 痘痘留下的疤痕怎么办 宫颈癌前病变1级怎么办 纹身后结痂很厚怎么办 纹身结痂蹭掉了怎么办 药流20天同房了怎么办 药流23天同房了怎么办 小产后不来月经怎么办 人流12天同房了怎么办 人流20天同房了怎么办 人流后5天同房了怎么办 人流后3天同房了怎么办 人流20后同房了怎么办 上环后月经量多怎么办 上环后喝啤酒了怎么办 取环当天同房了怎么办 生完孩子有外痔怎么办 怀孕了宫腔积液怎么办 做完爱4天怕怀孕怎么办 半永久眉失败了怎么办 取环前2天同房了怎么办 怀孕了发现有子宫肌瘤怎么办 宫腔中央性粘连怎么办 孕妇宫腔粘连带怎么办 内膜厚怎么办吃什么好 功血引起的贫血怎么办 吃宫血宁后月经不来了怎么办 孕晚期胎心不好怎么办 胎心不好怎么办让住院 39 5胎心不好怎么办 肺长了一个肿瘤怎么办 血糖高伤口不愈合怎么办 有轻微的狐臭该怎么办 嘴上汗毛太重怎么办 风把裙子吹起怎么办 每天三四点醒来就睡不着怎么办 打游戏手汗太多怎么办 老年人胸闷气短呼吸困难怎么办 冒险岛宠物饿了怎么办 不小心喝了黑墨怎么办 压的双眼皮开了怎么办