发布于 

iOS APNs: Background Fetch

在前面的几篇文章中, 给大家介绍了跟推送相关的内容.

今天跟大家聊一聊 iOS7 新加入的 Background Fetch 功能.

该系列博客:

iOS APNs: 远程推送
iOS APNs: 本地推送
iOS APNs: 处理数据
iOS APNs: 静默推送
iOS APNs: Background Fetch(本篇)

简介

Background Fetch 字面上来看, 大致意思是可在后台获取数据.

在 iOS7 中,Apple 为开发者提供了可以在后台更新应用程序界面和内容的 API, 即 Background Fetch.

该特性允许开发者在一个周期间隔后进行特定的动作,如获取网络内容, 更新 UI 操作等.

同时在 iOS7 中, 也加入了另一个特性, 就是博文 iOS APNs: 静默推送 里面说的静默推送.

这些都是对 iOS 后台多任务的补充和完善, Apple 一直在优化系统从而增强用户体验.

开启 Background Fetch

1.需要 APP 支持

如下图所示, 勾选即可.

1

2.设置 fetch 时间间隔

在 AppDelegate 中设置.

1
2
3
4
5
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

// 设置 fetch 时间间隔
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
}

UIApplicationBackgroundFetchIntervalMinimum 是系统自定义的时间. 如果不设置, 默认是 UIApplicationBackgroundFetchIntervalNever, 这样就不会让 Background Fetch 生效了.

可以查看对 UIApplicationBackgroundFetchIntervalNever 的官方解释.

1
2
3
UIApplicationBackgroundFetchIntervalNever

A fetch interval large enough to prevent fetch operations from occurring.

当然, 你也可以设置自己定义的时间的间隔, 但是基本没有什么作用, 因为这个时间间隔完全由系统来决定, 系统会根据你的电量以及使用频率来决定.

所以, 可以理解为 setMinimumBackgroundFetchInterval 方法只是开启了 Background Fetch 功能.

3.开启了系统后台更新功能

在 iOS 系统中, 设置/通用/后台应用刷新中一定要开启对应 APP 的功能.

判断是否已经开启该功能的示例代码:

1
2
3
4
if ([[UIApplication sharedApplication] backgroundRefreshStatus] != UIBackgroundRefreshStatusAvailable) {

//不可用提示用户
}

处理回调

在实际的应用环中,Background Fetch 事件是由系统管理的,我们开发者是无法预先知道 Fetch 事件达到的时机的.

网上很多说可以使用 Xcode 模拟这个事件, 估计也是之前的系统和 Xcode 版本, 现在的 Xcode9 貌似不行了.

但是, 你的手机在后台等几分钟, 有时候会被系统触发该事件, 触发后, 对应的系统回调(在 AppDelegate 中)会被调用.

1
2
3
4
5
6
7
8
9
10
// Background fetch 回调
- (void)application:(UIApplication *)application
performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

MZLOG(@"AppDelegate. Background fetch.");

//可进行对应的耗时操作, 如下载等.

completionHandler(UIBackgroundFetchResultNoData);
}

Background Fetch 会为我们的 App 争取更多的后台时间, 但是一般是几十秒左右, 不会太多. 所以, 不要在回调中做太多耗时的操作.


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

veryitman