iOS 7多任务概要 - 产品经理/工程师版本
产品经理版本
后台获取
- App进入后台后,可以主动发起获取数据请求,时长30秒
- 频率和时机受iOS调度,不能做到完全确定
- 常与后台传输服务结合使用
- 用例:社交网络应用,每隔一段时间获取最新文本内容、缩略图
远程(推送)通知
- 由server发起,可以远程唤醒App执行后台任务,时长30秒
- 技术上是一种静默的远程推送,用户不知情
- 频率受苹果控制,不能滥用
- 常与后台传输服务、本地推送结合使用
- 用例:服务器向视频、杂志应用订阅用户发送通知,后台静默下载,用户打开应用时即显示最新内容
后台传输
- 常与前两种结合使用,也可单独使用
- 传输时机受iOS调度,不能做到完全确定;iOS设备电量较好(高电量或接入电源),并连接WiFi时运行的可能性较高
- 适用大文件传输,没有运行时长限制
- 用例:云存储同步、视频订阅后后台下载
工程师版本
Background Fetch
- Info.plist, Required background modes key添加fetch value
- 设置最短fetch间隔:默认是
UIApplicationBackgroundFetchIntervalNever
,如果改变此值将永远不会fetch;UIApplicationBackgroundFetchIntervalMinimum
是可以设置的最短间隔;另外可以设置一个NSTimeInterval类型的值。无论作何设置,都只是建议,不作保证,最终的fetch间隔由OS决定。 - 实现
application:performFetchWithCompletionHandler:
。completionHandler需要一个UIBackgroundFetchResult
类型的参数,告知OS三种情况:NewData/NoData/Failed。BackgroundFetch的超时限制是30秒,如果需要超出此限制,需要使用Background Transfer Service API。 - 两种模拟Background Fetch的方法:一种通过Simulator菜单;另一种通过Xcode->Scheme,选中Launch due to a background fetch event选项。
- 限时30秒
Remote Notifications
- Info.plist, Required background modes key添加remote-notification value
- Notification Payload: 添加
{content-available: 1}
键值对 - 实际上是Silent Push Notifications,可以远程唤醒应用来处理远程推送通知,用户并不知情。
- 典型的use case: Remote Notifications静默通知app有新的内容,app初始化一个Background Download Task,完成后以Local Notifications的形式通知用户有新的内容。
- 与Background Fetch的区别:Background Fetch由客户端主动发起,由OS调度,适合高频率请求;Remote Notifications由server发起,受apns server控制,适合并不频繁的内容更新。
- 实现
application:didReceiveRemoteNotification:fetchCompletionHandler:
。之后的处理与Background Fetch类似。 - 限时30秒
Background Transfer Service
- 基于NSURLSession,支持HTTP/HTTPS,由OS调度
- 实现
application:handleEventsForBackgroundURLSession:completionHandler:
方法。 - discretionary/non-discretionary: 如果
discretionary==YES
,则更可能在设备电量良好且有WiFi连接时被执行,后台运行的NSURLTask此值必须为YES。 - 不限传输时长
Reference
附小广告一则:唱吧iOS团队诚招iOS工程师,推荐成功即奖励6000元现金或iPhone 6一部,详见这篇blog。