https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
Background Execution 后台执行
后台执行
当UIBackgroundModes键包含音响值时,系统的媒体框架自动阻止相应的应用程序,从它移动到后台时被暂停。只要它正在播放音频或视频内容或记录音频内容,应用程序继续在后台运行。但是,如果录制或播放停止,系统挂起的应用程序。
可以使用任何系统音频框架与背景声频内容的工作,以及使用这些框架的过程中是不变的。 (对于视频播放AirPlay的多,您可以使用媒体播放器或AV Foundation框架出示您的视频)。由于同时播放媒体文件,您的应用程序不暂停,回调而您的应用程序在后台运行正常。在你的回调,但是,你应该做的只需要工作来进行播放提供数据。例如,一个音频流的应用程序将需要从它的服务器下载音乐数据流和将当前音频样本进行播放。应用程序不应该执行无关播放任何多余的任务。
由于多个应用程序可以支持音频,系统确定哪个应用被允许在任何给定的时间来播放或录制音频。前台应用始终优先用于音频操作。这是可能被允许多个后台程序来播放音频和此类决定是基于每个应用程序的音频会话对象的配置。你总是应该适当地配置您的应用程序的音频会话对象,并使用该系统的框架来共同处理中断以及其他类型的音频相关通知。有关如何配置后台执行音频会话对象的信息,请参见音频会话编程指南。
执行有限长度的任务
移动到后台应用有望把自己变成一个静止状态尽可能快地使他们可以被系统暂停。如果你的应用程序是在任务执行过程中,需要一些额外的时间来完成这一任务,它可以调用beginBackgroundTaskWithName:expirationHandler:或beginBackgroundTaskWithExpirationHandler:对的UIApplication对象的方法来请求一些额外的执行时间。调用这些方法之一延误您的应用程序的暂时停牌,给它一些额外的时间来完成其工作。一旦这项工作完成后,你的应用程序必须调用endBackgroundTask:方法来让系统知道它已完成,可以暂停。
expirationHandler:或beginBackgroundTaskWithExpirationHandler:向beginBackgroundTaskWithName每个呼叫方法产生一个唯一的令牌与相应任务相关联。当你的应用完成一个任务,它必须调用endBackgroundTask:方法与相应的记号,让系统知道,任务就完成了。未能调用endBackgroundTask:一个后台任务的方法会导致您的应用程序终止。如果在启动任务时提供的到期处理,系统调用处理程序,并给你最后一次机会结束任务,并避免终止。
你不需要等到你的应用程序移动到后台指定后台任务。一个更有用的设计是调用beginBackgroundTaskWithName:只要你完成方法:expirationHandler:或beginBackgroundTaskWithExpirationHandler:方法一开始任务之前并调用endBackgroundTask。你甚至可以在你的应用程序在前台执行遵循这种模式。
清单3-1显示了如何启动长时间运行的任务时,你的应用程序转换为背景。在本实施例中,请求启动后台任务包括过期处理以防万一任务花费的时间太长。任务本身,然后提交给调度队列异步执行,使得applicationDidEnterBackground:方法能正常返回。使用的块的简化,以保持到任何重要的变量,诸如背景任务标识符的引用的代码。该bgTask变量是存储的指针到当前后台任务标识符和先于它在该方法中使用初始化类的成员变量。
注:在开始一项任务时,始终提供到期处理,但如果你想知道你的应用程序已经离开了多少时间来运行,得到的UIApplication的backgroundTimeRemaining属性的值。在您自己的到期处理程序,您可以包括需要收出你的任务额外的代码。但是,包括任何代码都必须用不了太长时间,因为执行,由你过期的处理程序被调用的时候,你的应用已经非常接近其时间限制。出于这个原因,只执行的你的状态信息最小清理和结束任务。
Downloading Content in the Background 在后台下载内容 (没用到不翻译).
执行长时间运行的任务
对于需要更多时间执行任务的落实,必须要求特定的权限,没有他们被暂停后台运行它们。在iOS中,只有特定类型的应用程序允许在后台运行:
应用程序在后台播放音频内容给用户,同时,如音乐播放器应用程序
应用程序,录制音频内容,而在后台
应用程序,使用户了解自己的位置在任何时候,如导航应用
支持互联网协议语音应用(VoIP)的
需要下载并定期处理新的内容应用
从外部附件收到定期更新的应用
实现这些服务的应用程序必须声明它们所支持的服务和使用的系统架构来实现这些服务的相关方面。声明服务让系统知道哪些服务可以使用,但在某些情况下,它是实际防止暂停您的应用程序的系统框架。
声明您的应用程序的支持后台任务
对于某些类型的后台执行的支持必须事先通过使用它们的应用程序中声明。在Xcode5及更高版本,声明你的应用程序从您的项目设置功能选项卡支持后台模式。启用后台模式选项将UIBackgroundModes关键看你的应用程序的Info.plist文件。选择一个或多个复选框增加相应的背景模式值,以该密钥。表3-1列出了可以指定后台模式和Xcode中分配给你的应用程序的Info.plist文件中UIBackgroundModes键的值。
前述各模式让系统知道你的应用程序应该被唤醒,或在适当的时候推出相关事件做出响应。例如,在开始播放音乐,然后移动到后台应用程式仍需要执行时间来填充所述音频输出缓冲器。启用音频模式告诉系统框架,他们应该继续在适当的间隔进行必要的回调到应用程序。如果应用程序不选择此模式,任何音频播放或应用程序记录停止时,应用程序移动到后台。播放和录制背景声音
可以播放或连续(即使该应用程序在后台运行)记录音频的应用程序可以注册在后台执行这些任务。您启用从功能选项卡的背景模式部分Xcode项目的音频支持。 (您还可以启用通过包括在你的应用程序的Info.plist文件中的音频值UIBackgroundModes关键的支持。)那部戏的背景下必须发挥的音频内容,而不是沉默的音频内容的应用程序。
背景音频应用的典型例子包括:
音乐播放器应用程序
录音应用
支持AirPlay的多音频或视频播放应用
VoIP的应用
当UIBackgroundModes键包含音响值时,系统的媒体框架自动阻止相应的应用程序,从它移动到后台时被暂停。只要它正在播放音频或视频内容或记录音频内容,应用程序继续在后台运行。但是,如果录制或播放停止,系统挂起的应用程序。
可以使用任何系统音频框架与背景声频内容的工作,以及使用这些框架的过程中是不变的。 (对于视频播放AirPlay的多,您可以使用媒体播放器或AV Foundation框架出示您的视频)。由于同时播放媒体文件,您的应用程序不暂停,回调而您的应用程序在后台运行正常。在你的回调,但是,你应该做的只需要工作来进行播放提供数据。例如,一个音频流的应用程序将需要从它的服务器下载音乐数据流和将当前音频样本进行播放。应用程序不应该执行无关播放任何多余的任务。
由于多个应用程序可以支持音频,系统确定哪个应用被允许在任何给定的时间来播放或录制音频。前台应用始终优先用于音频操作。这是可能被允许多个后台程序来播放音频和此类决定是基于每个应用程序的音频会话对象的配置。你总是应该适当地配置您的应用程序的音频会话对象,并使用该系统的框架来共同处理中断以及其他类型的音频相关通知。有关如何配置后台执行音频会话对象的信息,请参见音频会话编程指南。
网友评论