使用Swift在后台下载

当用户没有积极使用我们的应用程序时,系统会将其移至后台状态,例如,音乐应用程序可能希望在锁定屏幕上播放音乐,任何新闻应用程序都可能希望在后台下载供稿,以最大程度地减少展示时间内容提供给用户。

这类工作分为3类:

  1. 当应用程序移至后台时,在前台启动短期任务的应用程序可能会要求额外的时间来完成该任务。
  2. 在前台开始下载的应用程序可以将下载职责移交给系统,从而允许操作系统在后台继续下载时挂起或终止。
  3. 需要在后台运行以支持特定任务类型的应用。

运行有限长度的任务

如果您的应用程序正在执行任务,并且需要一点额外的时间来完成该任务。

调用beginBackgroundTask :暂时延迟应用程序的终止,使其有一点额外的时间(180秒)来完成其工作。 完成该工作后,您的应用程序必须调用endBackgroundTask :方法,以使系统知道它已完成并且可以挂起。

beginBackgroundTask:方法生成一个唯一的令牌以与相应的任务相关联。 当您的应用程序完成任务时,它必须使用相应的令牌调用endBackgroundTask :方法,以使系统知道任务已完成。

在后台下载内容

在下载文件时,应用程序应使用URLSession对象开始下载,以便在应用程序被挂起或终止的情况下,系统可以控制下载过程。

如果您的应用在传输过程中终止,则系统会在后台继续传输,并在传输完成后启动您的应用(视情况而定)。

实施长期任务

对于需要更多执行时间才能实现的任务,您必须请求特定权限才能在后台运行它们而不会被暂停。 在iOS中,只允许特定的应用类型在后台运行:

  • 导航应用程序,可让用户每次都知道其位置
  • 一个音乐播放器应用,可在后台播放用户可听的内容
  • 支持互联网协议语音(VoIP)的应用程序
  • 定期下载和处理新内容的应用程序(即新闻应用程序)
  • 接收来自外部配件的定期更新的应用程序

要在应用程序中启用后台服务,我们必须在应用程序的Info.plist添加“ 必需的后台模式 ”键

定期获取少量内容

定期从网络下载并处理少量内容的应用程序可以要求系统将其唤醒,以便它们可以启动对该内容的提取操作。 为了支持此模式,我们必须在Xcode项目的“ 功能”选项卡的“后台模式”部分中启用“ 后台 获取 ”。

提取间隔

如果获取间隔是UIApplicationBackgroundFetchIntervalMinimum,则系统将决定何时调用performFetchWithCompletionHandler方法。

请注意,获取间隔是最小而不是最大! 因此,系统决定后,您的应用程序将被唤醒。 这可能是一天一次或一天多次。

委托方法

当系统在后台启动您的应用程序时,在AppDelegate.swift内部调用了一个委托方法performFetchWithCompletionHandler :。

使用该方法检查新内容,并在内容可用时启动下载操作。 一旦下载完新内容,就必须执行提供的完成处理程序块,并传递指示内容是否可用的结果。

执行此块告诉系统它可以将我们的应用程序移回暂停状态并评估其电源使用情况。

与外部配件通讯

对于某些定期发送数据的附件类型(例如心率监视器),此支持非常重要。

启用此模式后,外部附件框架不会关闭与附件的活动会话。当附件中有新数据到达时,该框架会唤醒您的应用程序以便可以处理该数据。 系统还唤醒应用程序以处理附件连接和断开连接通知。

注意 :任何支持附件更新的后台处理的应用都必须遵循一些基本准则:

  • 应用程序必须提供一个允许用户启动和停止附件更新事件传递的界面。 然后,该界面应根据需要打开或关闭附件会话。
  • 唤醒后,该应用程序将有大约10秒钟的时间来处理数据。 理想情况下,它应尽快处理数据并允许其再次挂起。 但是,如果需要更多时间,则应用程序可以使用beginBackgroundTaskWithExpirationHandler:方法请求更多时间; 不过,只有在绝对必要时才应这样做。

与蓝牙配​​件通讯

如果蓝牙外围设备兼容的应用程序在挂起时是否要求唤醒,则外围设备是否会提供更新。 对于定期发送数据的Bluetooth-LE配件(例如Bluetooth心率传送带),此支持非常重要。

启用此模式后,Core Bluetooth框架将为相应的外围设备保持活动的活动会话。 此外,从外围设备收到的新数据会导致系统唤醒应用程序,以便它可以处理数据。

在后台吸引用户的注意

通知是挂起,处于后台或未运行的应用程序引起用户注意的一种方式。 应用程序可以使用本地通知来显示警报,播放声音,为应用程序的图标添加徽章或将这三者结合使用。

例如,一个闹钟应用程序可能会使用本地通知来播放闹钟声音并显示警报以禁用该闹钟。

当通知传递给用户时,用户必须确定信息是否需要使应用程序回到前台。 (如果应用程序已经在前台运行,则本地通知会悄悄地传递给应用程序而不是用户。)

在大多数情况下,在用户强行退出应用后,系统不会重新启动应用。 位置应用程序是一个例外,位置应用程序在iOS 8及更高版本中被用户强行退出后重新启动。

但是,在其他情况下,用户必须明确启动应用程序或重新启动设备,然后系统才能将应用程序自动启动到后台。 在设备上启用密码保护后,系统不会在用户首次解锁设备之前在后台启动应用程序。