Background Fetch

 

Background Fetch 是iOS7开始提供的一个数据拉取机制,主要是用于需要频繁更新内容的应用,例如社交、新闻或者天气应用。当实现了这个机制,系统会学习用户使用应用的习惯,并尽量在用户下次打开应用之前,给应用一个后台启动(或者叫后台唤醒)的机会,让应用提前可以准备数据。例如,如果用户总是在下午1点打开应用,那么系统会学习到这个习惯,并尽量在1点之前触发Background Fetch。

这个机制实现起来很简单。

第一步,在Capacities -> Background Modes 选中 Background fetch。

 

Background Fetch_第1张图片

也就是确保Info.plist中存在UIBackgroundModes,并存在fetch这一项。

代码块

  UIBackgroundModes
  
    fetch
  

第二步,在AppDelegate中调用-[UIApplication setMinimumBackgroundFetchInterval:]

代码块

[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

setMinimumBackgroundFetchInterval的参数类型是NSTimeInterval,但苹果建议只需要填写UIApplicationBackgroundFetchIntervalMinimum或UIApplicationBackgroundFetchIntervalNever,因为这个最低调用间隔的数值只是建议的数值,最终调度的频率还是系统控制。因此如果要启用Background fetch,传入UIApplicationBackgroundFetchIntervalMinimum;如果要禁用,传入UIApplicationBackgroundFetchIntervalNever。

第三步,实现AppDelegate的application:performFetchWithCompletionHandler:。

代码块

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    completionHandler(UIBackgroundFetchResultNewData);
//    completionHandler(UIBackgroundFetchResultNoData);
//    completionHandler(UIBackgroundFetchResultFailed);
}

进入这个回调后,我们可以通过completionHandler告诉系统“后台数据获取准备完成了,系统可以挂起进程了”。当调用completionHandler后,系统会立即挂起进程。

completionHandler的参数有三个UIBackgroundFetchResultNewData、NoData和Failed,这三个结果经过测试目前没发现明显区别,或许只是拿来关联学习用户行为的一个参数。

当应用后台启动(或唤醒)时,completionHandler必须在30秒内调用,否则系统会把进程kill。通过 completionHandler 也就可以控制进程的后台存活时长。

你可能感兴趣的:(Background Fetch)