尽管背景音频功能和会话类别,背景音频仍停止

Background audio stops despite background audio capability and session category

我正在使用 AudioKit 在我的应用程序中播放声音,我想让音频在后台继续播放。但是当应用程序进入后台或者当我进入 iPhone 的锁定屏幕时,应用程序的音频停止。

我已经在 XCode 中启用了背景音频功能(并确认适当的项目已添加到 Info.plist)。

我已将会话类别设置为 .playback,根据 AKSettings.swift 中的评论:

Audio is not silenced by silent switch and screen lock - audio is non mixable

所以我的理解是,如果我设置此类别并在我的 Info.plist 中启用背景音频,那么即使在锁定屏幕中也应该可以听到音频,但音频会静音(直到我解锁 phone 然后返回应用程序)。

我编写了一个非常简单的示例,除了应用委托(当然还有 AudioKit)之外不需要任何文件:

import UIKit
import AudioKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.main.bounds)
        self.window?.rootViewController = UIViewController()
        self.window?.makeKeyAndVisible()

        // The important bits:  
        try? AKSettings.setSession(category: .playback)
        AudioKit.output = AKWhiteNoise()
        try? AudioKit.start()
        return true
    }
}

如您所见,我所做的只是设置会话类别并播放一些白噪声。当我启动应用程序时,我可以很好地听到白噪音,只有当 phone 被锁定或应用程序处于后台时,它才会静音。

另一件值得注意的事情:当我更换时:

try? AKSettings.setSession(category: .playback)

与:

try? AKSettings.setSession(category: .playAndRecord)
let s = AKStereoInput()

然后音频 继续在 background/locked 屏幕中播放,但随后闪烁的红色录音系统栏出现在顶部。所以大概应用程序保留在后台,因为 AKStereoInput 在初始化时分配了一个输入节点。

其他值得注意的事情:

我是不是遗漏了什么明显的东西?也许是一个设置或什么?或者我应该在 AudioKit github 上提出问题?

好的,我找到了一个解决方案,所以我将 post 放在这里以防有人遇到这个问题。

答案在this github issue

基本上,如果您想使用 .playback 作为您需要包括的类别:

AKSettings.playbackWhileMuted = true

默认为false。查看 AKSettings.swift:267 看起来 playbackWhileMuted 在获取计算的会话类别时使用。所以请注意,您使用 AKSettings.setSession 设置的值可能不是 "computed" 的值,除非您记得设置适当的标志。

更新

我也刚刚尝试删除这一行:

try? AKSettings.setSession(category: .playback)

没有它也能正常工作。所以看起来简单地设置 playbackWhileMuted 就足够了。我想我可能误解了何时使用 setSession