iOS下的后台任务实现方法


后台任务


场景一

地图后台定位  


场景二

后台播放音乐


场景三 

后台 更新推送内容 


场景四 

voip  IP电话   视频通话


关于Background Fetch的更多请参考:四种后台机制中关于Background Fetch的解释,这里只说明怎么使用Background Fetch

一,开启Background Fetch支持

XCode->TARGETS->Capabilities->Background Modes打开并添加Background Fetch.

同时在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加:

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

MinimumBackgroundFetchInterval参数值是两次Fetch时间间隔,不能保证每隔这个时间间隔都会调用。这里设置为UIApplicationBackgroundFetchIntervalMinimum,意思是尽可能频繁的调用我们的Fetch方法。

二,增加实现Fetch方法

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{};

每次系统Fetch时都会调用该方法,我们可以在该方法中做刷新数据等操作,操作执行完成以后要调用completionHandlerblock(),比如:completionHandler(UIBackgroundFetchResultNewData);文档中说系统会根据completionHandler(执行的时间)来估计此次Fetch的耗电等。如果耗时耗电比较多,可能会降低被调用的次数。但这个方法也不是不限时执行的,说是有30s的时间来执行操作。completionHandler有三个参数:

UIBackgroundFetchResultNewData 成功拉取数据

UIBackgroundFetchResultNoData 没有新数据

UIBackgroundFetchResultFailed 拉取数据失败或者超时

三,模拟Fetch事件

在实际的IOS7环境中,Fetch事件是由系统管理的,app开发者无法预先知道Fetch事件达到的时机。但XCode也提供了Fetch事件的调试办法,在XCode上运行程序后,在Debug->Simulate Background Fetch.

还有一种情况是app没有运行(不在前台也不在后台),被Fetch事件唤醒执行.这种情况的测试方法如下:

Product->Scheme->Edit scheme Debug模式选中Options,点选Launch due to a background fetch event,运行即可。

[特酷吧]可以观察到当Fetch事件到来时,app先进入后台,再执行- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{}

四,判断设备是否开启后台应用程序刷新功能


折叠C/C++ Code复制内容到剪贴板

if ([[UIApplication sharedApplication] backgroundRefreshStatus] != UIBackgroundRefreshStatusAvailable)

{

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"您没有开启后台刷新,请在 设置->通用->应用程序后台刷新 中开启." delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];

[alertView show];

[alertView release];

}








在 iOS 7 之前,当程序置于后台之后开发者们对他们程序所能做的事情非常有限。除了 VOIP 和基于地理位置特性以外,唯一能做的地方就是使用后台任务(background tasks)让代码可以执行几分钟。如果你想下载比较大的视频文件以便离线浏览,亦或者备份用户的照片到你的服务器上,你都仅能完成一部分工作。

iOS 7 添加了两个新的 API 以便你的程序可以在后台更新界面以及内容。首先是后台获取(Background Fetch),它允许你定期地从网络获取新的内容。第二个 API 就是远程通知(Remote Notifications),这是一个当事件发生时可以让推送通知主动提醒应用的新特性,这两者都为你的应用界面保持最新提供了极大的帮助。在新的后台传输服务 (Background Transfer Service) 中执行定期的任务,也允许你在进程之外可以执行网络传输(下载和上传)工作。

后台获取 (Background Fetch) 和远程通知 (Remote Notification) 基于简单的 ApplicationDelegate 钩子,在应用程序挂起之前的 30 秒时钟时间执行工作。它们不是用于 CPU 频繁工作或者长时间运行任务,而是用来处理长时间运行的网络请求队列,例如下载一部很大的电影,或者执行快速的内容更新。

对用户来说,多任务处理有一点显而易见的改变就是新的应用切换程序 (the new app switcher),它用来呈现应用到后台时的界面快照。这些快照的存在是有一定理由的--现在你可以在后台完成工作后更新程序快照,以用来呈现新的内容。社交网络、新闻或者天气等应用现在都可以直接呈现最新的内容而不需要用户重新打开应用。我们稍后会介绍如何更新屏幕快照。

后台获取

后台获取是一种智能的轮询机制,它很适合需要经常更新内容的程序,像社交网络,新闻或天气的程序。为了在用户启动程序前提前触发后台获取,系统会根据用户行为唤醒应用程序。举个例子,如果用户经常在下午 1 点使用某个应用程序,系统会学习,适应并在使用周期前执行后台获取。为了减少电池使用,使用设备无线通信的所有应用的后台获取会被合并,如果你向系统报告新数据无法获取,iOS 会适应并使用此信息避免会继续获取。

开启后台获取的第一步是在 info plist 文件中对 UIBackgroundModes 键指定特定的值。最简单的途径是在 Xcode 5 的 project editor 中新的 Capabilities 标签页中设置,这个标签页包含了后台模式部分,可以方便配置多任务选项。


或者,你可以手动编辑这个值

UIBackgroundModes

    fetch

  

接下来,告诉 iOS 多久进行一次数据获取

- (BOOL)application:(

你可能感兴趣的:(iOS下的后台任务实现方法)