App Programming Guide for iOS -> 后台执行(二)

跟踪用户的位置

这里有几种方式在后台跟踪用户的位置,其中大部分都不会要求你的应用在后台继续运行。

  • 位置重大改变(significant-change)服务(推荐)
  • 前台专用(Foreground-only)位置服务
  • 后台(Background)位置服务

位置重大改变服务强烈推荐给那些不需要高精度位置数据的应用。使用此服务,位置更新旨在用户的位置重大改变的时候才发生;这样,对于社交应用或者提供非关键相关位置信息的应用特别理想。如果更新发生时应用被挂起,系统会在后台唤醒它来处理这个更新。如果应用启动了这个服务然后终止,系统会在新位置可用的时候自动重启这个应用。这个服务在iOS及更高版本中可用,并且它仅在包含有蜂窝无线电(cellular radio)的设备上可用。

前台专用和后台位置服务两者都使用 Core Location标准位置服务来取得位置数据。唯一的区别是,如果应用被挂起,前台专用位置服务停止传递更新,如果应用不支持其它后台服务或任务它就会发生。前台专用位置服务适用于只在前台时需要位置数据的应用。

你在Xcode项目的Capabilities选项卡中的Background Modes部分启用位置支持。(你也能通过设置应用的Info.plist文件的UIBackgroundModes键的值为location来启用这个支持。)启用这个模式不会阻止系统挂起应用,但是它告诉系统每当有新位置数据传送的时候系统应该唤醒应用。这样,这个有效的键让应用在有位置更新发生时会在后台处理它们。

重要:建议你谨慎地使用标准服务,或者使用位置重大改变服务来替代。位置服务要求积极shyingiOS设备的板载无线电硬件。持续运行这个硬件会消耗大量的电量。如果你的应用不需要向用户提供精确且持续的位置信息,最好最小化使用位置服务。

关于如何在你的应用中使用每种不同的位置服务,参见Location and Maps Programming Guide。

播放和录制后台音频

连续播放或录制音频的应用(甚至应用在后台运行的时候)可以通过注册以便在后台执行这些任务。你可以在Xcode项目的Capabilities选项卡的Background Modes部分启用支持。(你也能通过设置应用的Info.plist文件的UIBackgroundModes键的值为audio来启用这个支持。)应用在后台播放音频内容必须是有声内容而不能是静音。

后台音频应用的典型例子包括:

  • 音乐播放应用
  • 音频录制应用
  • 支持通过AirPlay播放音频或视频的应用
  • VoIP应用

当UIBackgroundModes键包含了audio值,当相关应用进入后台的时候系统的媒体框架自动地阻止它被挂起。只要应用在播放视频内容或录制音频内容,应用就会在后台持续运行。但是,如果录制或播放停止,系统就挂起该应用。

你能使用任何系统的音频框架来处理后台音频内容,并且使用这些框架的过程不变。(要通过AirPlay播放视频,你能使用Media Player或AV Foundation框架来呈现你的视频。)因为当播放媒体文件的时候应用不会被挂起,所以应用在后台时可以正常地回调操作。在你的回调中,你只需要提供播放所需的数据即可。例如,流音频应用将需用从它的服务器下载音乐流数据,并将当前音频样本推出以进行播放。应用不应该执行与播放无关的任何任务。

因为可能有多个应用支持音频,系统会在任何一个给定时间决定哪个应用是被允许播放或录制音频的。前台应用总是优先进行音频操作。多个后台应用被允许播放音频的情况是有可能的,这样只能基于每个应用音频会话对象的配置来决定优先级。你应该总干事恰当地配置应用的音频会话对象,并与系统框架一起小心地处理中断以及其它类型的音频相关通知。关于如何为后台执行配置音频会话对象的信息,参见Audio Session Programming Guide。

实现一个VoIP应用

互联网音频协议(VoIP)应用允许用户使用一个互联网连接代替设备的蜂窝服务来拨打电话。这样的应用要求维持一个持续的与它的相关服务连接的网络连接,以便它能接收到呼入电话以及其它相关的数据。比起全天候的保持VoIP应用清醒,系统允许它们被挂起并且对它们的sockets(套接字)提供监控会更好。当检测到传入流量是,系统唤醒VoIP应用并将sockets的控制权返还给它,

要配置VoIP应用,你必须做到下面几步:

  1. 在Xcode项目的Capabilities选项卡的Background mode部分,启用支持VoIP。(你也能通过在应用的Info.plist文件中包含值为voip 的UIBackgroundModes键来启用支持。)
  2. 为VoIP使用配置一个应用的sockets。
  3. 在进入后台之前,调用setKeepAliveTimeout:handler:方法来安装一个需要定期执行的处理程序。应用使用这个处理程序来维持它的服务器连接。
  4. 配置你的音频会话来处理来自活跃用途的收发转换。

在UIBackgroundModes键中包含voip值,让系统知道它将允许应用在后台运行来管理它的网络sockets。系统启动后,拥有这个键的应用立即在后台重启,以确保VoIP服务始终可用。

大多数VoIP应用还需要被配置为后台音频应用,以便在后台的时候可以传递音频。因此,你应该在UIBackgroundModes键中包含audio和voip两个值。如果不这样做,应用不能在后台的时候播放或录制音频。更多关于UIBackgroundModes键的信息,参见 Information Property List Key Reference。

关于实现一个VoIP应用必须要做的步骤的具体信息,参见Tips for Developing a VoIP App.。

有机会就获取少量内容

需要周期性的检查新内容的应用,可以请求系统唤醒它们,以便它们可以启动一个该内容的获取操作。为了支持这种模式,在Xcode项目的Capabilities选项卡的Background modes部分启用Background fetch选项。(你也可以通过给应用的Info.plist文件的UIBackgroundModes键包含fetch值来启用这项支持。)启用了这项支持并不保证系统让你随时在后台执行获取操作。系统必须平衡应用的需要,以便根据其它应用和系统自身的需要来获取内容。在评估信息后,当有好的机会时,系统就会给应用时间。

当好的机会出现的时候,系统在后台唤醒或者重启你的应用,并调用应用的application:performFetchWithCompletionHandler:委托方法。使用这个方法来检查新内容,并在内容可用的时候启动下载操作。一旦你完成新内容的下载,你必须执行提供的完成处理代码块(block),传递表示是否内容可用的结果。执行这个代码块,告诉系统它能将应用移回到挂起状态,并评估电量的使用情况。那些快速下载少量内容、并准确反映何时有可供下载的内容的应用,与那些花很长时间下载它们的内容或者声明内容可用但又不下载的应用相比,更有可能在将来得到更多的执行时间。

当下载任何内容时,推荐你使用NSURLSession类来启动和管理你的下载。有关如何使用这个类来管理上传和下载任务的信息,参见URL Session Programming Guide。

使用推送通知启动下载

如果当新内容已经可用时,你的服务器发送推送通知到用户的设备,你可以在后台请求系统运行你的应用,以便它立即开始下载新的内容。这个后台模式的目的是最小化用户看到推送通知到应用能够显示相关内容之间经过的总时间。应用通常在用户看到通知大致相同的时间被唤醒,但是它仍然会比其它可能的方式给你更多的时间。

为了支持这个后台模式,在Xcode项目的Capabilities选项卡的 Background modes部分启用Remote notifications选项。(你也可以通过设置Info.plist文件的UIBackgroundModes键包含remote-notification值来启用这个支持。)

为了推送通知触发一个下载操作,通知的有效载荷必须包含值为1的content-available键。当该键存在时,系统在后台唤醒应用(或将其启动到后台)并调用应用委托的application:didReceiveRemoteNotification:fetchCompletionHandler:方法。执行这个方法下载相关的内容并将其融入到你的应用中。

当下载任何内容时,建议你使用NSURLSession类来启动和管理你的下载。有关如何使用这个类来管理上传和下载任务的信息,参见URL Session Programming Guide。

在后台下载Newsstand内容

下载新发行杂志或报纸的Newsstand应用能在后台注册,用来执行这些下载。你在Xcode项目的Capabilities选项卡的Background modes部分启用 newsstand downloads支持。(你也可以通过设置Info.plist文件的UIBackgroundModes键包含 newsstand-content值来启用这个支持。)当此键存在的时候,系统启动应用,如果它还没有运行,以便它能开始下载新发行的。

当你使用 Newsstand Kit框架来开始一个下载,系统为你的应用处理下载过程。即便应用被挂起或者被终止,系统仍然会继续下载这些文件。当下载操作完成的时候,系统会传输这个文件到你的应用沙盒,并通知你的应用。如果应用没有运行,这个通知会唤醒它,并给它一个机会来处理新下载的文件。如果在下载过程中有错误,你的应用也会用类似的方式被唤醒处理。

关于如何使用Newsstand Kit 框架下载内容的信息,参见Newsstand Kit Framework Reference。

与外部配件通信

使用外部配件的应用,如果配件在应用被挂起的时候传递了一个更新,应用可以请求被唤醒。这个支持对于一些以固定时间间隔传递数据的配件类型特别重要,例如心率监测器。你在Xcode项目的Capabilities选项卡的Background modes部分启用 external accessory communication支持。(你也可以通过设置Info.plist文件的UIBackgroundModes键包含 external-accessory 值来启用这个支持。)当你启用这个模式,外部配件模块不能使用配件关闭活动会话。(在iOS4及更早版本,这些会话会在应用被挂起的时候自动关闭。)当新数据从配件到达的时候,这个框架唤醒你的应用以便它能处理此数据。系统也唤醒应用来处理配件连接并断开通知。

任何支持配件更新后台处理的应用,都必须遵循以下基本指南:

  • 应用必须提供一个接口来允许用户开始和停止配件更新事件的发送。这个接口应该能在合适的时候打开或者关闭配件会话。
  • 被唤醒后,应用有大概10秒钟来处理数据。理想情况下,它应该尽可能块的处理数据,并允许自己被再次挂起。但是,如果需要更多的时间,应用可以使用beginBackgroundTaskWithExpirationHandler:方法来请求额外的时间;只有当绝对需要的时候才这样做。
使用蓝牙(Bluetooth)配件连接

使用蓝牙外设的应用,如果当应用被挂起时外设传递一个更新,那么应用可以请求被唤醒。此支持对于在固定间隔传递数据的 Bluetooth-LE外设来说很重要,例如蓝牙心率传输带。你在Xcode项目的Capabilities选项卡的Background modes部分启用 bluetooth accessories支持。(你也可以通过设置Info.plist文件的UIBackgroundModes键包含 bluetooth-central 值来启用这个支持。)当你启用此支持,Core Bluetooth框架会让相应的外设的任何活动会话保持打开状态。此外,从外设来的新数据使系统唤醒应用以便它处理这些数据。系统也唤醒应用来处理配件连接以及断开通知。

在iOS 6,应用也能使用蓝牙配件在外设模式下运行。为了如蓝牙配件般行为,你必须在Xcode项目的Capabilities选项卡的Background modes部分启用支持此模式。(你也可以通过设置Info.plist文件的UIBackgroundModes键包含 bluetooth-peripheral 值来启用这个支持。)启用这个模式让 Core Bluetooth框架在后台短暂地唤醒应用,以便它能处理配件相关的请求。为这些时间而被唤醒的应用应该处理它们,并尽可能快的返回以便它能在此被挂起。

任何支持后台处理蓝牙数据的应用,都必须基于会话,并遵循下面几条基本的指导:

  • 应用必须提供接口来允许应用开始及停止蓝牙时间的传送。这个接口应该在合适地时候打开或关闭会话。
  • 被唤醒后,应用有大概10秒钟来处理数据。理想情况下,它应该尽可能块的处理数据,并允许自己被再次挂起。但是,如果需要更多的时间,应用可以使用beginBackgroundTaskWithExpirationHandler:方法来请求额外的时间;只有当绝对需要的时候才这样做。

(未完待续......)

你可能感兴趣的:(App Programming Guide for iOS -> 后台执行(二))