本文转载至 http://www.cocoachina.com/applenews/devnews/2013/1114/7350.html

本文主要教你如何使用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. {
  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. [self.refreshControl endRefreshing];
  10. }
当你添加以下方法时,getRandomNumberBetween提醒将会被禁止:
  1. -(int)getRandomNumberBetween:(int)from to:(int)to {
  2. return (int)from + arc4random() % (to-from+1);
  3. }
 为了在 NSArray object上加载对象,我们需要执行TableView委托函数。
  1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  2. return 1;
  3. }
  4. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  5. return self.objects.count;
  6. }
  7. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  8. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
  9. cell.textLabel.text = self.objects[indexPath.row];
  10. if(indexPath.row < self.numberOfnewPosts){
  11. cell.backgroundColor = [UIColor yellowColor];
  12. }
  13. else
  14. cell.backgroundColor = [UIColor whiteColor];
  15. return cell;
  16. }
非常简单吧?如果运行项目,你会看到一个类似下图的界面:
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. }
  10. }
下一步你应该也把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);
  13. }
完成代码,现在我们模拟一个测试,并验证所有项目都能启动和运行。
 
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

iOS 7 SDK: 如何使用后台获取(Background Fetch)的更多相关文章

  1. Swift - 后台获取数据(Background Fetch)的实现

    前面讲了如何让程序申请后台短时运行.但这个额外延长的时间毕竟有限.所以从iOS7起又引入两种在后台运行任务的方式:后台获取和后台通知. 1,后台获取介绍 后台获取(Background Fetch)是 ...

  2. iOS,APP退到后台,获取推送成功的内容并且语音播报内容。

    老铁,我今天忙了一下午就为解决这个问题,网上有一些方法,说了一堆关于这个挂到后台收到推送并且获得推送内容的问题,有很多人都说APP挂到后台一会就被杀死.但实际上可以有办法解决的. WechatIMG3 ...

  3. iOS 七牛云上传并获取图片----【客户端】

           最近做了七牛云存储的有关内容,涉及到与后台交互获取验证的token,无奈,后台自命清高,不与理会,没办法呀,于是自己搞呗.首先呢在在七牛上注册一个账号,然后呢添加一个存储空间这时候空间名 ...

  4. iOS 和 Android 中的后台运行问题

    后台机制的不同,算是iOS 和 Android的一大区别了,最近发布的iOS7又对后台处理做了一定的更改,找时间总结一下编码上的区别,先做个记录. 先看看iOS的把,首先需要仔细阅读一下Apple的官 ...

  5. 开发者所需要知道的 iOS 10 SDK 新特性

    转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...

  6. iOS检测用户截屏并获取所截图片

    iOS检测用户截屏并获取所截图片 微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好.在iOS7之前, 如果用户截屏 ...

  7. fir.im Weekly - 从 iOS 10 SDK 新特性说起

    从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 的分屏多任务特性,今年的 WWDC iOS 10 SDK ...

  8. iOS学习笔记(十三)——获取手机信息(UIDevice、NSBundle、NSLocale)

    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到 ...

  9. iOS沙盒(sandbox)机制及获取沙盒路径

    一.每个iOS应用SDK都被限制在沙盒中,沙盒相当于一个加了仅主人可见权限的文件夹,苹果对沙盒有以下几条限制. (1).应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒. (2).应 ...

随机推荐

  1. postgresql一般crud存储过程参考[转]

    http://blog.csdn.net/cdnight/article/details/18082255 这里是一份经过再三调试测试而成功的postgres数据库单表crud存储过程,请注意,对于多 ...

  2. JAVA中的static方法

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  3. Python 列表 min() 方法

    描述 Python 列表 min() 方法返回列表元素中的最小值. 语法 min() 方法语法: min(L) 参数 L -- 要返回最小值的列表. 返回值 返回列表元素中的最小值. 实例 以下实例展 ...

  4. unity, 两个动画同时播

    法一,animationLayer. 处于不同animationLayer中的状态可以同时运行,即其中的动画可以同时播放. 所以通常一个角色至少需要用两个animationLayer,一个layer用 ...

  5. atitit.安全的签名摘要 算法attilax总结

    atitit.安全的签名 算法attilax总结 1. MD5 (不推荐)结果是128位二进制,只有转为16进制字符串是32位 1 2. 使用sha1算法加密后的密串长度有40位,相对更安全一些.Sh ...

  6. [elk]logstash统计api访问失败率

    处理原始日志 日志从moogoo导出来的 { "mobile" : "13612345678", "isp" : "中国移动_广东 ...

  7. 使用digitalocean搭建v·p·s

    这几天digitalocean开始猛卡,一顿操作之后连不上了=_=遂复习了一下怎么搭vps 准备工作 事先准备好Putty,直接百度搜索下载即可(也可直接使用digitalocean的access c ...

  8. 第十六周oj刷题——Problem E: B 构造函数和析构函数

    Description 在建立类对象时系统自己主动该类的构造函数完毕对象的初始化工作, 当类对象生命周期结束时,系统在释放对象空间之前自己主动调用析构函数. 此题要求: 依据主程序(main函数)和程 ...

  9. @XStreamAlias使用

    @XStreamAlias使用 一. 特点: 简化的API; 无映射文件; 高性能,低内存占用; 整洁的XML; 不需要修改对象;支持内部私有字段,不需要setter/getter方法 提供序列化接口 ...

  10. Android基础总结(三)SQLite,ListView,对话框

    测试 黑盒测试 测试逻辑业务 白盒测试 测试逻辑方法 根据测试粒度 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试:syste ...