【问题标题】:How to keep receiving the data when app is sent to background mode?当应用程序发送到后台模式时如何继续接收数据?
【发布时间】:2019-03-28 15:51:41
【问题描述】:

在 iOS12 中,如果网络请求不是 URLSessionDownloadTask,则苹果开始取消网络请求并设置后台会话。

但根据苹果官网:

您不必在后台进行所有后台网络活动 会话...声明适当的应用程序 后台模式可以使用默认的 URL 会话和数据任务,就像 如果他们在前台

我正在使用自定义播放器流式传输媒体文件,应用程序启用了 AudioBackground Fetch 模式。 URLSessionDataTask 在应用程序进入后台状态后立即在前台初始化任务被取消。

我知道 AVPlayer 可以在后台流式传输,但不能使用 AVPlayer。

我知道我可以设置与URLSessionDownloadTask 的会话,它将在单独的进程中下载数据并返回文件路径,由于流式传输要求,这不是一个选项。

我知道我可以使用UIApplication.shared.beginBackgroundTask 请求额外的后台执行时间,但这不是可接受的解决方案,因为如果backgroundTimeRemaining 在流完成应用程序之前到期,则会被终止。

当应用程序处于后台模式时,有什么方法可以继续接收数据?

【问题讨论】:

  • 您是否 100% 确定您的“自定义播放器”使应用程序在后台运行并且应用程序没有被暂停?
  • 是的。只要缓冲区中有数据,它就会播放,然后停止。

标签: ios


【解决方案1】:

确保您的后台会话启用了shouldUseExtendedBackgroundIdleMode。如果你不这样做,当应用程序从前台执行转换到后台执行时,会话将停止数据任务。或者,正如 Downloading Files in the Background 文档所述,您也可以使用不会出现这种行为的 default 会话配置。


FWIW,在使用AVPlayer 时,除了启用背景音频功能...

...您可能还需要告诉共享音频会话实例它处于活动状态:

try AVAudioSession.sharedInstance().setCategory(.playback)
try AVAudioSession.sharedInstance().setActive(true)

我不能说您的“自定义播放器”需要什么,但对我来说,我必须同时执行这两项操作才能让应用程序在后台运行,并使用AVPlayer 播放音频。

【讨论】:

  • shouldUseExtendedBackgroundIdleMode 设置为true 的情况下进行测试,当应用程序处于后台状态时(但看起来下载暂停),一旦设备被锁定,连接就会被取消。我知道当使用 AVPlayer 系统保持连接时,我怀疑 AVPlayer 具有特殊权限。如果您想检查项目设置/查看描述的行为,这里是测试项目的链接。 dropbox.com/s/iljpunkkzi47t4l/DataTaskExample.zip
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多