提问者:小点点

在后台运行一个应用程序,播放一些音频和加速度计


几天来我一直被困在一个点上。基本上,我正在开发一个应用程序,通过播放一些音频来引导用户(用户无法控制这些音频,没有播放/暂停),并且通过付费音频,它还使用加速度计来获取数据,根据这些数据以规则的间隔计算一些结果。意味着我正在播放一些音频,然后启动加速度计大约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)一个接一个地播放一些音频


共1个答案

匿名用户

为此您不需要(也不应该使用)BeginBackgroundTask。这是对系统的一个提示,即您正在开始一个短暂的任务,如果应用程序在任务结束前进入后台,将会获得一点额外的时间来完成任务。这用于将数据保存到文件系统或完成网络操作。

“后台进程”是一个完全不同的工具,用于长时间运行的实用程序进程,如优化数据库或运行学习算法。你不应该用它来做这个。

如果您正在播放背景音频,那么您必须使用背景音频模式。请参阅链接文档,了解如何配置该功能,以及如何控制背景音频。(您可能已经在Xcode中选中了正确的配置框,但您还需要确保配置并激活了与您的用例匹配的AVAudioSession。您可能需要.playback,也可能需要.mixwithothers)它一般需要持续的发挥。例如,你不能轻易地在将来的任意时间启动音频。

您可能还会从启用后台位置事件中受益。

iOS中没有通用的“后台运行”工具。有几个专门的工具用于解决特定的问题,您需要使用与您的用例匹配的工具。在iOS中,后台操作非常复杂,您需要阅读您使用的每个工具的文档,以了解如何配置它,以及它允许哪些操作和不允许哪些操作。