在 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 打瞌睡?