ios background modes

iOS APP的运行状态
  • Not runing:应用还没有启动,或者应用正在运行但是中途别系统停止。
  • Inactive:当前应用正在前台运行,但是不接收事件(当前或许正在执行其他代码)。一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡过短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电,有未读短信等)事件的时候。
  • active:当前应用正在前台运行,并且接收事件。这是应用正在前台运行时所处的正常状态。
  • Suspended:应用处在后台,并且已经停止执行代码。系统自动的将应用一如此状态,且在此举之前不会对应用做任何通知。当初在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存警告时,系统会将处于Suspend状态的应用清除出内存以为正在前台运行的应用提供足够的内存。
  • Background:应用处在后台,并且还在执行代码。一般的应用都会在这个状态短暂的停留(最多10分钟),然后就会被系统强制进入suspend状态。而iOS为了在某些情况下提供更好的体验,提供了一些选项,只要满足这些选项的条件,就可以在后台运行很长的一段时间。
后台模式 Background Modes
Background modes
  • Audio, AirPlay and Picture in Picture
    这个选项包含四种场景:音频的播放,录音,airPlay 以及画中画视频播放。
  • 音频的播放:在播放音频时,即使应用退到后台,只要一直有音频在播放,那应用就可以一直在后台运行。
  • 录音:应用可以请求使用麦克风,当开启了此后台选项,应用在使用麦克风时,即使退到后台,也可以一直后台运行,通过查看微信安装包中的plist文件,微信语音聊天,就是通过这种方式实现的。而当该类应用退到后台后,iOS系统的状态栏会变成红色,并在状态栏中显示正在使用麦克风的应用的名称。
  • AirPlay:是指将iOS设备,或者Mac设备上的音视频,同步到另一个设备中播放。举两个例子,第一个是把iPhone上的音乐通过蓝牙的方式在汽车的蓝牙音箱播放,第二个是把iPhone上的视频,同步到智能电视屏幕上播放。此功能一般用于多端以及多屏的交互。
  • 画中画的视频播放:画中画是ipad版本的iOS9新增的加的功能,可以在iOS的桌面,或者其他的应用的界面的上面提供播放视频,从而该视频区域所属的应用就可以后台运行了。此功能现在只在ipad应用中提供。

例如音频播放

  • 事先在项目里导入一个MP3音频文件


    音频文件
  • 导入AVFoundation框架,在APPdelegate中配置音频会话
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //    后台播放音频设置
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setActive:YES error:nil];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    //    让APP支持接受远程控制事件
    [[UIApplication sharedApplication]beginReceivingRemoteControlEvents];
    
    _window = [[UIWindow alloc]initWithFrame:UIScreen.mainScreen.bounds];
    _window.backgroundColor = UIColor.whiteColor;
    _window.rootViewController = [[ViewController alloc]init];
    [_window makeKeyAndVisible];
    
    return YES;
}

//ViewController中播放音频
- (void)viewDidLoad {
    [super viewDidLoad];
//    播放背景音乐
    NSString *path = [[NSBundle mainBundle]pathForResource:@"01 丑八怪" ofType:@"mp3"];
    NSURL *url = [[NSURL alloc]initFileURLWithPath:path];
//    创建播放器,_player一定要设置成全局变量,否则没有声音
    _player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
    [_player setVolume:1];
    _player.numberOfLoops = -1;//-1为一直循环
    _player.pan = 0.0;
    _player.rate = 1.0;
    [_player prepareToPlay];
    [_player play];//播放
}
最后别忘了在Background modes 里面勾选第一条
image.png
打开info.plist 文件,可以看到配置已经写入
info.plist
  • Location Updates
    一般用于导航应用中,开启此选项后,因公退到后台,还可以得到系统的定位更新,从而使得应用可以根据定位的变化做出不同的反应

  • Voice over IP
    voip 类的应用允许用户使用网络而不是手机打电话,因此这一类的应用需要保持同它相关的服务的网络连接,用以收到来电事件和其他数据。iOS 不是通过一直让该应用处于激活状态来达到这个目的,而是同样也会将这类的应用挂起,但同时会在应用挂起期间由系统接管它的VoIP的socket,当这个socket有数据通信时,系统会再次唤醒处于挂起状态的应用,同时将socket的控制器交还给该应用,让其正常的处理来电事件和其他数据。

  • Newsstand downloads
    iOS开发中,有一类叫报刊杂志类的应用比较特别,iOS9之前的系统中,此类应用会统一收在系统内置的【报刊杂志】应用中,在iOS9中则去掉了内置的【报刊杂志】应用,此类应用得以以单独的图标入口出现在桌面中。此后台运行的选项就是提供给报刊杂志类应用可以哎后台下载及处理报刊杂志内容,而下载的过程需要使用NewsstandKit中的NKAssetDownload进行下载。需要注意的是,下载的过程中,应用可能还是会被挂起,设置应用被退出,而iOS会在WiFi环境下继续下载,知道下载完成。而一旦下载完成,如果应用只是被挂起,则iOS会唤醒对应的应用。回调对应的时间;如果应用已经退出,则会启动应用,在启动参数中带上对用的标识表示这次启动是因为下载报刊杂志内容完成。http://www.viggiosoft.com/blog/blog/2011/10/17/ios-newsstand-tutorial/

  • External Accessory communication
    此选项提供给一些MFI外设通过蓝牙,或者Lightning 接头等方式与ios设备连接,从而可在外设发送消息时,唤醒已被挂起的应用。而一旦被唤醒,一般情况下应用只有10s的执行时间。MFI外设:是指通过苹果MFI认证的设备,而MFI认证是对其授权配件厂商生产的外置配件的一种标识使用许可,是made for ios 的应为缩写。

  • Uses Bluetooth LE accessories
    此选项与External Accessory communication 类似,只是此选项不限制MFI外设,而需要的是Bluetooth LE 设备。

  • Acts as a Bluetooth LE accessory
    此选项是指iOS设备作为一个蓝牙外设连接时,
    对应的应用可以后台运行,但是使用此模式需要用户进行授权认证。

  • Background fetch
    iOS7新增加的一个选项,用于即使在后台,也需要频繁的更新数据的应用。例如一个pm2.5的应用,需要几个小时更新一次数据,那么可以开启此选项,设置一个时间间隔,从而让iOS在间隔时间内在后台启动该应用,执行指定数据的获取工作,而此过程最多只能执行30秒,代码参考http://www.jianshu.com/p/82f639012f3e

  • Remote notifications
    iOS7新增的一个选项,推送唤醒,iOS7以前,当你收到推送消息时,你需要首先打开应用,等待应用从网络上获取推送的信息之后才能将信息呈现出来。而iOS7之后改变了这一过程。当系统收到推送消息时,不是首先提醒用户,而是唤醒对应的应用,让应用在后台获取对应的消息,当消息处理完成后再通知用户。而收到推送的回调方法最多只能执行30s(要包含"content-available":1字段,才能回调代理方法)。代码参考 http://www.jianshu.com/p/82f639012f3e

  • 基于 NSURLSession 的后台传输
    此为iOS7新增加的特性,用于在后台下载或者上传大文件,步骤如下:创建后台传输用的NSURLsession对象,向这个对象中加入对用的传入的NSURLsessionTask,并开始传输;在实现Appdelegate里实现-application:handleEventsForBackgroundURLSession:completionHandler:方法,以刷新UI及通知系统传输结束。一旦后台传输的状态发生变化(包括正常结束和失败)的时候,应用将被唤醒并运行appdelegate的回调。但是也有一些限制,后台传输只会通过WiFi来进行。后台下载的时间与以前的关闭应用后x分钟的模式不一样,而是为了节省电力变为离散式的下载。代码实现可以参考:http://onevcat.com/2013/08/ios7-background-multitask/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容