在 Swift 中,如何让其他应用在我的应用打开时继续播放音频?

Posted

技术标签:

【中文标题】在 Swift 中,如何让其他应用在我的应用打开时继续播放音频?【英文标题】:In Swift, how do I let other apps continue to play audio when my app is open? 【发布时间】:2015-08-31 13:47:25 【问题描述】:

我环顾四周,发现了一些类似的问题,但没有完全相同的问题......如果我在某个地方错过了答案,我深表歉意。

我正在完成我使用 SpriteKit 用 Swift 编写的游戏。

在我玩过的大多数其他游戏中,我可以让 itunes 或其他东西在后台播放音乐,并且在我玩游戏时仍然可以听到它。

在我玩游戏时,我注意到它会自动关闭来自其他应用的音频。

我没有使用AVAudioPlayer 作为声音,因为我目前只有少量的音频效果,所以我只是使用了一个 SKAction.playsoundfilenamed 动作。

我确实有逻辑来打开和关闭我的声音,但这只是使用一些内部 if/else 逻辑。

我想知道是否有一些 AVAudio 属性我可以设置以允许其他应用程序音频在我的打开时继续播放?我在文档中找不到这个。

谢谢!

【问题讨论】:

谢谢大家!看起来所有这些答案都行得通,但我选择了最简单的! 【参考方案1】:

将您的AVAudiosession 类别设置为Ambient

import AVFoundation.AVAudioSession

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil)

此类别也适用于“随玩”风格的应用,例如用户在播放音乐应用时弹奏的虚拟钢琴。当您使用此类别时,来自其他应用程序的音频会与您的音频混合。您的音频会通过屏幕锁定和静音开关(在 iPhone 上称为响铃/静音开关)静音。

【讨论】:

【参考方案2】:

在 Xcode 8.2.1、Swift 3(最新语法)中,这对我有用:

import AVFoundation

override func viewDidLoad() 
    super.viewDidLoad()

    let audioSession = AVAudioSession.sharedInstance()
    do 
        try audioSession.setCategory(AVAudioSessionCategoryPlayback, with: [.mixWithOthers])
        try audioSession.setActive(true)
    catch
        // handle error
    

    // the rest of your code

【讨论】:

正确答案,救命稻草【参考方案3】:

截至 2015 年 10 月 14 日的 xCode 7,这对我有用。

根据您使用的 Swift 版本,将其放在 GameViewController.swift 中。

//Swift 2.2
import AVFoundation.AVAudioSession
//Swift 3.0
import AVFoundation

并将这段代码放在 ViewDidLoad 中:

try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

“try”的用法是当您希望程序执行某项操作然后捕获错误时。这是一个错误处理程序。通过添加感叹号,您几乎是在说“我知道这不会失败”。

这对我有用。我正在播放背景音乐,就像我的应用一样。

【讨论】:

【参考方案4】:

在应用启动时调用此代码,以便您的 AVAudioSession 让其他应用参与进来:

let audioSession = AVAudioSession.sharedInstance()    
audioSession.setCategory(AVAudioSessionCategoryPlayback, withOptions:AVAudioSessionCategoryOptions.MixWithOthers, error: nil);
audioSession.setActive(true, error: nil)

【讨论】:

【参考方案5】:

我不确定您的viewController 的架构是否,但您可以尝试在viewDidLoad 中运行它,或者创建一个在viewDidLoad 中调用的独立方法。

此代码可能有更好的位置,但在不知道您的应用代码是什么样子的情况下,您可以将其粘贴在那里,看看是否可以使其正常工作。

// this goes at the top w/ your import statements
import AVFoundation



// you could put this in your viewDidLoad or wherever it's appropriate for your code

    let session = AVAudioSession.sharedInstance()
    session.setCategory(AVAudioSessionCategoryAmbient, withOptions: nil, error: nil)
    session.setActive(true, withOptions: nil, error: nil)

Example code from GitHub

AVAudioSession class reference

【讨论】:

以上是关于在 Swift 中,如何让其他应用在我的应用打开时继续播放音频?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的应用打开且屏幕打开时允许 Android 打瞌睡?

使用人脸 ID 从锁定屏幕打开时应用程序被阻止

相机打开时如何释放相机?

如何向使用我的 iOS 应用的人发送应用内公告?

AppDelegate 方法仅在应用程序已打开时从通知中调用

为啥即使我的数据库已连接,我的 Heroku 应用程序在其他设备中打开时也没有加载任何数据?