1. 开启后台请求服务: 具体操作在plist 里 添加key值: Required background modes value值:fetch. 更方便的是在XCode5 中勾选:
2. 设置最小请求时间间隔, 例如在 appdidfinishlunch 方法实现:
- (
BOOL
)application:(
UIApplication
*)application
didFinishLaunchingWithOptions
:(
NSDictionary
*)launchOptions
{
[application
setMinimumBackgroundFetchInterval
:UIApplicationBackgroundFetchIntervalMinimum];
return
YES
;
}
(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的时候, 触发后台请求
远程通知支持静默远程通知,即: 不提示任何信息, 不打扰用户, 实现方式也很简单 只要服务端发送 这个样的一个json就可以了
aps{
content-available:
1
}
//或者
aps{
content-available:
1
}
实现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一次, 否则可能会延迟推送.
说明:
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