IOS后台任务

http://onevcat.com/2013/08/ios7-background-multitask/

IOS提供了以下多中方式处理后台任务

1:beginBackgroundTaskWithExpirationHandler

2:特定任务的后台处理

3:后台获取

4:推送唤醒

5:后台传输

其中后面3种方式IOS7之后才支持

beginBackgroundTaskWithExpirationHandler

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _count = 0;
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(function) userInfo:nil repeats:YES];
    return YES;

}
-(void)function {
    _count++;
    NSLog(@"function:%d",_count);
}

上面代码开启了一个定时器,每隔一秒输出count的值,但当我们的应用退到前台后定时器停止运行,我们可以通过函数beginBackgroundTaskWithExpirationHandler向系统请求更多地时间运行我们的代码,这个"更多的时间"经过测试大概在3分钟左右

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _count = 0;
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(function) userInfo:nil repeats:YES];
    return YES;

}
-(void)function {
    _count++;
    NSLog(@"function:%d",_count);
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{

    _identifier = [application beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"ss");

        [application endBackgroundTask:_identifier];
        _identifier = UIBackgroundTaskInvalid;
    }];

}

_identifier是整型变量,beginBackgroundTaskWithExpirationHandler设置了一个超时回调函数,当超过3分钟后后台任务将被挂起同时执行超时函数,我们应该在超时函数中调用endBackgroundTask,下面代码展示了beginBackgroundTaskWithExpirationHandler更一般的调用方式

- (void)beginBackgroundTask {
    UIApplication *application = [UIApplication sharedApplication];
    _identifier = [application beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundTask];
    }];
}

- (void)endBackgroundTask {
    UIApplication *application = [UIApplication sharedApplication];
    [application endBackgroundTask:_identifier];
    _identifier = UIBackgroundTaskInvalid;
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [self beginBackgroundTask];

    //后台任务

    [self endBackgroundTask];
}

后台获取

后台获取是IOS7新增内容,它的核心作用是设定一个间隔,然后每隔一段时间唤醒应用处理相应地任务,比如我们使用的社交软件,可以每个一定时间获取最新的信息,这样下次我们进入后就不需要等待刷新,使用后台获取的步骤如下:

1:添加应用对后台获取的支持,可以在plist文件中修改UIBackgroundMode一项,增加fetch,或者在应用信息的capabilities->background modes中勾选background fetch

2:设置最小后台获取时间间隔

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    return YES;
}

如果不设置的话默认为UIApplicationBackgroundFetchIntervalNever,表示不获取,而且这个值代表"最小"后台获取时间间隔,这里所指定的时间间隔只是代表了“在上一次获取或者关闭应用之后,在这一段时间内一定不会去做后台获取”,IOS并不会为了每一个应用频频唤醒CPU,具体唤醒时间得看系统调度,设置为UIApplicationBackgroundFetchIntervalMinimum表示尽可能的对我们的应用进行后台唤醒,这样设置的缺点是耗电。

3:实现application:performFetchWithCompletionHandler

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cnblogs.com/zanglitao/"]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@",[error localizedDescription]);
            completionHandler(UIBackgroundFetchResultFailed);
        } else {
            ////更新UI
            NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            completionHandler(UIBackgroundFetchResultNewData);
        }

    }];

    [task resume];
}

与beginBackgroundTaskWithExpirationHandler相似,系统提供了回调completionHandler,用于通知系统任务执行完毕

推送唤醒

1:在UIBackgroundModes添加remote-notification

2:更改推送的payload:需要在payload中添加content-available,并设置为1

3:实现推送唤醒代码

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

代码实现与上一种方式一致,任务实现完需要调用回调方法通知系统

后台传输

IOS7中提供了NSURLSession替代NSURLConnection实现数据传输,NSURLSession的用法之前博文有提

时间: 2024-10-29 03:55:09

IOS后台任务的相关文章

iOS 后台任务之 Long-running background task

项目里遇到需求需要App进入后台还能执行一些任务,于是便Google了一下,整理一篇小记录. 大家都知道iOS系统里,所有App进入后台的时候默认都是会暂停所有线程,等到再双击Home键回到前台才会继续执行.那有的场景需要在后台进行upload.download,或者进行一些计算等等怎么办呢? iOS7推出了一些新的API,让,那就是 NSURLSession ,就是为了取代前 NSURLConnection而生,在我们常用的 AFNetworking 2.0 中也新增了对其的支持 (AFURL

iOS 后台任务

首先开启后台任务 使用设置后台任务触发的时机 application.setMinimumBackgroundFetchInterval(UIApplication.backgroundFetchIntervalMinimum) func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult)

ios实现程序切入后台,实现后台任务

- (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in

iOS的后台任务

翻译自:http://www.raywenderlich.com/29948/backgrounding-for-ios (代码部分若乱码,请移步原链接拷贝) 自ios4开始,用户点击home按钮时,你可以将app设计为挂起状态.app在内存中,除非用户再次返回到app,否则该app暂停运行.都是这种情况吗? 当然不是,在一些例外的情况下,app仍然可以在后台保持运行.这篇文章将介绍如何以及何时应用(几乎)所有这些后台操作功能. 应用后台运行模式实际上有很严格的限制条件,在ios上实现真正的多任

ios实现程序切入后台,实现后台任务 (转自)

1 1,项目需求,是程序home键切入后台,3分钟后退出登陆, 2 3 首先,iOS 会再持续切入后台,给我们5秒钟的时间去处理相关数据,5秒后,程序不会再执行任何代码,处于挂起状态. 4 5 6 7 8 9 - (void)applicationDidEnterBackground:(UIApplication *)application { 10 11 //切入后台 ,申请后台任务时间, 12 13 UIApplication *app = [UIApplication sharedAppl

iOS开发简单的实现后台任务(诸如后台播放音乐,定时器,后台定位等)

最多能运行多长时间,没挑战过极限,具体能保持多长时间需要自己测试下. 注意:用真机测试 直接上代码 在appdelegate的.m中的进入后台时加入一些代码操作即可 /** *  当app进入后台时调用 */ - (void)applicationDidEnterBackground:(UIApplication *)application { /** *  app的状态 *  1.死亡状态:没有打开app *  2.前台运行状态 *  3.后台暂停状态:停止一切动画.定时器.多媒体.联网操作,

iOS App Extensions

一.扩展概述 扩展(Extension)是iOS 8中引入的一个非常重要的新特性.扩展让app之间的数据交互成为可能.用户可以在app中使用其他应用提供的功能,而无需离开当前的应用. 在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据. 而在引入扩展之后,其他app可以与扩展进行数据交换.基于安全和性能的考虑,每一个扩展运行在一个单独的进程中,它拥有自己的bundle, bundle后缀名是.appex.扩展bundle必须包含在一个普通应用的bundle

iOS开发系列--音频播放、录音、视频播放、拍照、视频录制

iOS开发系列--音频播放.录音.视频播放.拍照.视频录制 转载:http://www.cnblogs.com/kenshincui/p/4186022.html#avFoundationCamera --iOS多媒体 概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 音

iOS App 性能优化总结

今天简单总结一些clientapp 优化的方案和方向. 我相信开发一个app大部分团队都能够完毕,可是性能久不一样啦,和我们都写一个冒泡算法一样,我相信每一个人写的冒泡算法都不一样,这些区别就带来了性能的区别. 所以一个好的app 不止看设计.和创意 ,还要看性能. 以下我就简单说几点性能优化点: 一.首页启动速度 启动过程中做的事情越少越好(尽可能将多个接口合并) 不在UI线程上作耗时的操作(数据的处理在子线程进行,处理完通知主线程刷新节目) 在合适的时机開始后台任务(比如在用户指引节目就能够