iOS7新特性之后台任务-Background Multitasking

iOS7发布了关于后台多任务的增强特性,即增加了3种后台多任务的功能:

  • Background Fetch 后台请求
  • Remote Notifications 远程通知(静默远程通知)
  • Background Transfer Service 后台传输服务

 Background Fetch

使用后台请求前需要进行3步操作:

1. 开启后台请求服务: 具体操作在plist 里 添加key值: Required background modes  value值:fetch. 更方便的是在XCode5 中勾选:

iOS7新特性之后台任务-Background Multitasking_第1张图片

2. 设置最小请求时间间隔, 例如在 appdidfinishlunch 方法实现:

- ( BOOL )application:( UIApplication *)application didFinishLaunchingWithOptions :( NSDictionary *)launchOptions
{
     [application setMinimumBackgroundFetchInterval :UIApplicationBackgroundFetchIntervalMinimum];
     
     return YES ;
}
说明: (1) 后台请求默认是关闭的, 即参数默认为:  UIApplicationBackgroundFetchIntervalNever ,如果设置了  UIApplicationBackgroundFetchIntervalMinimum 参数, 就说明使用系统推荐的时间间隔去执行后台任务.

(2) 如果自定义了时间, 那么系统会按照我设置的时间尽量去执行, 但是我尽量不要设置时间过于频繁,因为系统会追踪请求间隔并记录. 当然系统不会准确的按照我设置的时间间

隔去执行, 因为受到当时系统内存, 电池量等因素影响. 

(3)如果使用了系统推荐的时间间隔, 系统会根据用户使用习惯去推测一个合理的时间间隔执行.

3. 实现Appdelegate的代理方法: 

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

(1) 当系统调用后台任务时, 会调用该方法, 我们可以在这个方法实现数据请求并更新UI等操作, 操作结束后回调系统的completionHandler块, 告知系统执行完成.

(2) 根据我们请求的结果,回调不同的参数:UIBackgroundFetchResultNewData,    UIBackgroundFetchResultNoData,    UIBackgroundFetchResultFailed

(3) 更新UI的目的是让用户一打开应用就立即看到已经缓存的最新数据, 而且后台的预览图也会随之更新, 所有当有敏感数据时,注意界面保密.

(4) 后台任务执行的时间大约是30秒, 所以尽量请求小数据,大数据下载与上传应该使用后台传输服务实现.

至此,后台请求服务就注册并可以执行了, 那么开发如何调试呢?

XCode 给出两种调试方式: 

1)  适用完全后台执行- 运行程序就进入后台任务:

首先新建一个scheme , 从现有的scheme 赋值一份出来

新scheme中的 run 项目栏中的 Options 中 勾选 Background Fetch 选项框

最后在新的scheme 中 Run 就可以了

2) 可以在程序Running的时候, 触发后台请求

iOS7新特性之后台任务-Background Multitasking_第2张图片


Remote Notifications

远程通知支持静默远程通知,即: 不提示任何信息, 不打扰用户, 实现方式也很简单 只要服务端发送 这个样的一个json就可以了 

aps{
    content-available: 1
}
//或者
aps{
    content-available: 1
alert: {...}
}


实现push通知需要两步实现:

1) 添加plist 值, 和后台请求一样的key value值是: remote-notification

2) 实现appDelegate的代理方法


2
3
4
5
6
-( void )application:( UIApplication *)application didReceiveRemoteNotification :( NSDictionary *)userInfo fetchCompletionHandler :( void (^)(UIBackgroundFetchResult))completionHandler{
     
     // Call or write any code necessary to download new data.
     
     completionHandler(UIBackgroundFetchResultNewData);
}
说明: 

(1)处理和后台请求基本一致, 只是触发后台请求的操作不单纯由我们自定义的时间间隔后系统的推荐时间间隔触发, 我们可以由自己的服务器主动触发后台请求或后台传输服务.

(2)静默推送执行时间也和后台请求一致,大约30秒.

(3)当然,静默push通知也是有频率限制的, 按照WWDC2013中的介绍, 每小时只能push一次, 否则可能会延迟推送.


Background Transfer Service

当我们需要上传或下载一些大数据的时候,就适合使用后台传输服务的API了,因为后台任务的运行时间没有绝对意义上的限制了,而且上传和下载的工作是由系统提供的API来完成的,系统会根据当前设备网络,电池,内存等因素,综合来规划执行后台传输服务的任务.

附上一张WWDC的PPT图片会更清晰:

说明:  

1) 后台传输服务的任务时间不再受限制, 而是由系统根据当前设备情况来分段执行的

2) 现在我们可以清楚的发现, 可以和上面两个服务一起来使用, 可以达到灵活的运用. 通常, 我们可以使用 background fetch 和 remote notification 的机制来被动或主动接受更新数据的事件, 然后再他们的代理方法中开启 background transfer service 的任务, 基本上 30秒的时间限制足够我们进行开启队列来执行后台传输服务的任务了, 剩下的就交给系统来帮我们管理什么时候下载和暂停.

3) 系统默认只在 WIFI环境下执行后台传输服务

4) 实现需要用到iOS7的新API NSURLSession 这个类

实现方式: 1) 初始化 NSURLSession 类, 它需要一个 NSURLSessionConfiguration对象做参数, 里面包含请求的设置

2) 实现 NSURLSession 的代理方法 

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask

                              didFinishDownloadingToURL:(NSURL *)location;

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask

                                           didWriteData:(int64_t)bytesWritten

                                      totalBytesWritten:(int64_t)totalBytesWritten

                              totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;


- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask

                                      didResumeAtOffset:(int64_t)fileOffset

                                     expectedTotalBytes:(int64_t)expectedTotalBytes;

3) 初始化 NSURLSessionTask, 有download 和 upload 两个子类方便使用,最后resume 开启即可, 具体实现可以参考官方Demo,连接在下面.


本人的内容绝大部分来自以下博客,只是自己总结而已:

http://code.tutsplus.com/tutorials/ios-7-sdk-mutlitasking-enhancements--mobile-20295

其他参考

WWDC2013 Video https://developer.apple.com/videos/wwdc/2013  找到What’s New with Multitasking

Apple 文档 https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS7.html

Apple的 Background Transfer Service Demo:
https://developer.apple.com/library/ios/samplecode/SimpleBackgroundTransfer/Introduction/Intro.html




你可能感兴趣的:(ios开发,ios7,后台任务,后台下载和上传,静默远程通知)