上篇主要讲了iOS4中的一些对应的API,这篇介绍下iOS7新增的一些API
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithName:(nullable NSString *)taskName expirationHandler:(void(^ __nullable)(void))handler NS_AVAILABLE_IOS(7_0) NS_REQUIRES_SUPER;
与系统申请额外的时间来处理未完成的任务, 这个函数与iOS4中增加的函数beginBackgroundTaskWithExpirationHandler:作用类似,并且调用后也需要调用endBackgroundTask: 方法来告诉系统任务完成了
iOS7还新增了一种系统智能调度的后台的方式background fetch,这个后台接口在苹果WWDC 2013上有提及,其会根据用户行为自动调整达到效率最优的后台模式,能够处理不是很有时效性的信息获取。例如一些社交、新闻类的应用的后台信息更新,iOS系统便会根据应用启动频率、时间和当前网络和电量的状况来智能分配每个应用的后台获取频率和启动时长。 由于拥有该接口的应用的数据后台刷新操作是统一调度的,因此系统可以在一个进程里面获得多个应用的数据,类似统一的推送机制,这样就能够最大限度地省电。不过这个方式也有一个缺点,那便是开发者不能设定数据具体什么时候更新,因此这个后台方式只能应用在一些时效性和敏感度不高的地方。
使用background fetch需要在info plist 文件中对 UIBackgroundModes 键指定特定的值。如下: 或者,你可以手动编辑这个值
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
然后调用函数setMinimumBackgroundFetchInterval设置多久进行一次数据获取,默认是不进行后台获取的,如果调用了这个函数,系统提供了两个值: UIApplicationBackgroundFetchIntervalMinimum 这个值要求系统尽可能频繁地去管理你的程序到底什么时候应该被唤醒,但如果你不需要这样的话,你也应该指定一个你想要的的时间间隔。UIApplicationBackgroundFetchIntervalNever这个值是指用户不需要获取新数据
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler API_AVAILABLE(ios(7.0), tvos(11.0));
当后台有数据获取的时候, 就会调用这个函数,完成回调的执行有两个目的。首先,系统会估量你的进程消耗的电量,并根据你传递的 UIBackgroundFetchResult 参数记录新数据是否可用。有三个值:
- UIBackgroundFetchResultNewData 收获了新数据
- UIBackgroundFetchResultNoData 没有新数据
- UIBackgroundFetchResultFailed 获取数据失败
当你调用完成的处理代码时,应用的界面缩略图会被采用,并更新应用程序切换器。当用户在应用间切换时,用户将会看到新内容。这种通过 completion handler 来报告并且生成截图的方法,在新的多任务处理 API 中是很常见的。
iOS中还加了后台刷新状态:UIBackgroundRefreshStatus, 有三个值:
- UIBackgroundRefreshStatusRestricted 由于设备配置,此系统上不可用;用户无法启用此功能
- UIBackgroundRefreshStatusDenied 用户对此应用程序显式禁用
- UIBackgroundRefreshStatusAvailable 为此应用程序启用
对应的还有UIApplicationBackgroundRefreshStatusDidChangeNotification可用