几天来我一直被困在一个点上。基本上,我正在开发一个应用程序,通过播放一些音频
来引导用户(用户无法控制这些音频,没有播放/暂停),并且通过付费音频,它还使用加速度计
来获取数据,根据这些数据以规则的间隔计算一些结果。
意味着我正在播放一些音频,然后启动加速度计大约4次。
每件事情都按照预期工作,但是当应用程序进入后台时,应用程序保持活动一段时间,操作系统终止/终止应用程序。
基本上整个流程大约需要6到7分钟--至少意味着我的应用程序需要在后台活动模式至少7分钟。我看到了stackOverFlow问题,但没有成功。
用户启动时我正在使用什么
self.backgroundTaskID = UIApplication.shared.beginBackgroundTask (withName: "Finish Network Tasks") {
// End the task if time expires.
UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
self.backgroundTaskID = UIBackgroundTaskIdentifier.invalid
}
self.startForFirsPhase()
当第一阶段超过I开始第二阶段和第三阶段后,前一阶段结束
info.plist
必需的后台模式
签名和功能
中的后台进程
和音频、AirePlay和画中画
播放音频的代码是blow
func play(name: String, volumeLevel: Float? = 1) {
// print("NameForAudio: ", name)
guard let path = Bundle.main.path(forResource: name, ofType: nil) else {
print("can not find path")
return
}
let url = URL(fileURLWithPath: path)
do {
try AVAudioSession.sharedInstance().setCategory(.playback)
self.audioPlayer = try AVAudioPlayer(contentsOf: url)
self.audioPlayer.volume = volumeLevel ?? 1
self.audioPlayer!.prepareToPlay()
self.audioPlayer!.play()
} catch {
print("some thing went wrong Name: \(error)")
}
}
所有的音频都喜欢加速度计,我使用DispatchQueue.Main.AsyncAfter(deadline:.now()+durationOfPreviousAudio)
一个接一个地播放一些音频
为此您不需要(也不应该使用)BeginBackgroundTask
。这是对系统的一个提示,即您正在开始一个短暂的任务,如果应用程序在任务结束前进入后台,将会获得一点额外的时间来完成任务。这用于将数据保存到文件系统或完成网络操作。
“后台进程”是一个完全不同的工具,用于长时间运行的实用程序进程,如优化数据库或运行学习算法。你不应该用它来做这个。
如果您正在播放背景音频,那么您必须使用背景音频模式。请参阅链接文档,了解如何配置该功能,以及如何控制背景音频。(您可能已经在Xcode中选中了正确的配置框,但您还需要确保配置并激活了与您的用例匹配的AVAudioSession。您可能需要.playback
,也可能需要.mixwithothers
)它一般需要持续的发挥。例如,你不能轻易地在将来的任意时间启动音频。
您可能还会从启用后台位置事件中受益。
iOS中没有通用的“后台运行”工具。有几个专门的工具用于解决特定的问题,您需要使用与您的用例匹配的工具。在iOS中,后台操作非常复杂,您需要阅读您使用的每个工具的文档,以了解如何配置它,以及它允许哪些操作和不允许哪些操作。