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

标签 ios swift background-process

我已经被困了好几天了。基本上,我正在开发一个应用程序 play some audios引导用户(用户无法控制这些音频,不能播放/暂停),并且对于付费音频,它也使用 accelerometer获取数据和calculate some results from this data with regular interval.意味着我正在播放一些音频,然后启动加速度计大约 4 次
一切都按预期工作,但是当应用程序进入后台时,应用程序将保持事件状态一段时间,并且操作系统终止/终止应用程序。
基本上整个流程至少需要 6 到 7 分钟,这意味着我的应用程序需要在后台模式下运行至少 7 分钟。我见过stackOverFlow questions但没有成功。
用户启动时我正在使用什么

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()

当第一阶段结束时,我在上一个阶段结束后开始第二阶段和第三阶段

  • 我已添加Required background modesinfo.plist
  • Background ProcessAudio, AirePlay and Picture in PictureSigning & Capabilities

播放音频的代码很糟糕

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)
            try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
            self.audioPlayer = try AVAudioPlayer(contentsOf: url)
            self.audioPlayer.volume = volumeLevel ?? 1
            self.audioPlayer!.play()
        } catch {
            print("some thing went wrong Name: \(error)")
        }
}

所有音频都喜欢使用加速度计,我使用 DispatchQueue.main.asyncAfter(deadline: .now() + durationOfPreviousAudio) 一个接一个地播放一些音频

我想做的是。我一个接一个地播放一些音频,然后启动加速计来获取一些运动传感器数据 1 分钟,然后我再次想播放​​一些音频,如果没有 UIApplication.shared.beginBackgroundTask 就无法播放。 .

最佳答案

为此,您不需要(也不应该使用)beginBackgroundTask。这向系统暗示您正在开始一项短期任务,如果应用程序在任务结束之前进入后台,则可以通过获得一点额外的时间来完成。这用于将数据保存到文件系统或完成网络操作等。

“后台进程”是一个完全不同的工具,用于长时间运行的实用程序进程,例如优化数据库或运行学习算法。您不应该将其用于此目的。

如果您正在播放背景音频,则必须使用background audio mode 。请参阅链接的文档,了解如何配置它以及如何控制背景音频。 (您可能已经在 Xcode 中选中了正确的配置框,但您还需要确保已配置并激活与您的用例匹配的 AVAudioSession。您可能需要 .playback 并且可能想要.mixWithOthers。)一般需要连续播放。例如,您无法在将来的任意时间轻松启动音频。

您可能还会受益于enabling background location events .

iOS 中没有通用的“后台运行”工具。有多种专用工具可用于解决特定问题,您需要使用与您的用例相匹配的工具。 iOS 中的后台操作很复杂,您需要阅读所使用的每个工具的文档,了解如何配置它以及它允许​​做什么和不允许做什么。

关于ios - 在后台运行应用程序并播放一些音频和加速度计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67162986/

相关文章:

Flutter 实时跟踪

ios - IOS 后台任务的 React-native native 模块可能性

ios - 如何在导航栏中创建后退按钮

ios - Xcode 配置文件数据警告

swift - 我可以在 Swift 中将默认类型分配给泛型类型 T 吗?

ios - 闭包递归和保留循环

iphone - iOS 企业部署/到期

ios - 如何在 3 次错误的触摸/面部 ID 识别后忽略 iOS 设备 PIN 提示

swift - 从 NSObject 继承的对象导致错误 Property 'self._username' not initialized at super.init call

bash - 下一个命令完成后,如何停止从 bash 启动的后台进程?