iOS7中加入了后台获取(Background Fetch)的特性,这个特性使得用户在打开应用以前应用就能够执行部分代码,好比准备数据,刷新UI等等。这个时常通常最大是30秒。网络
如下是设置Background Fetch的基本步骤,记录一下。app
1. 点击Target下的Capabilities ->>Background Modes ->>Background fetch 打钩。dom
2. 设置fetch最短间隔测试
能够直接在AppDelegate里面的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法内加上fetch
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
UIApplicationBackgroundFetchIntervalMinimum 是告诉系统尽量频繁的进行Background fetch,可是这个频率多频繁呢?这个是系统本身决定的,开发者就没法得知啦。spa
即便你把 MinimumBackgroundFetchInterval 设的很小,系统也只能保证在这个时间段内程序不会被唤醒,而不是说每过这么长时间就会被唤醒。所以,开发者应该理性设置唤醒的时间,根据程序的具体状况来考虑。代理
3. 接下来就能够实现这个带Block回调的 Background fetch 的代理方法了。code
在这里咱们能够进行网络请求查看是否数据有更新。不过由于超时限制是 30秒,因此若超过这个时间,就须要使用Background Transfer Service。orm
我在这个方法里面写了一个本地通知用来测试。blog
//------------------------------------------------------------- #pragma mark - Background fetch related delegate //------------------------------------------------------------- - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { NSLog(@"我就是传说中的Background Fetch💦"); UILocalNotification * localNoti = [[UILocalNotification alloc] init]; localNoti.hasAction = YES; //滑动来... NSArray * actionMsgs = @[@"查看一个巨大的秘密",@"看看小伙伴在作什么",@"看美女图片",@"领取奖品",@"看看洪哥在作什么",@"掏钱买下一个DropBeacon",@"请世文吃饭"]; localNoti.alertAction = [actionMsgs objectAtIndex:arc4random()%actionMsgs.count]; localNoti.alertBody = @"我就是传说中的Background Fetch💦"; [[UIApplication sharedApplication] scheduleLocalNotification:localNoti]; completionHandler(UIBackgroundFetchResultNewData); }
4. 接下来就能够进行测试了。
测试的方法有两种。
第一种能够在RunScheme的选项中勾选Launch due to a background fetch event,以下图
第二种方式是选择Xcode 菜单栏的 Debug下的 Simulate Background Fetch来将模拟器直接切换到 Background Fetch状态,以下图