Swift:设备锁定时继续播放声音

Posted

技术标签:

【中文标题】Swift:设备锁定时继续播放声音【英文标题】:Swift: Keep playing sounds when the device is locked 【发布时间】:2015-06-14 17:22:08 【问题描述】:

我正在使用以下代码播放来自互联网的 URL 的声音:

var audioPlayer = AVPlayer()

...

let audiosession = AVAudioSession.sharedInstance()
audioSession.setCategory(AVAudioSessionCategoryAmbient, error: nil)

let url = trackFileName
let playerItem = AVPlayerItem( URL:NSURL( string:url ) )
audioPlayer = AVPlayer(playerItem:playerItem)
audioPlayer.rate = 1.0;
player.play()

我试图确保它在后台继续播放,这就是我使用“AVAudioSession.sharedInstance()”的原因。当我通过锁定屏幕在模拟器中尝试时,它会继续按预期播放。但是,如果我在设备中播放它,一旦屏幕自动显示或我自己锁定,声音就会关闭。

我的代码中缺少什么?

【问题讨论】:

看这里:developer.apple.com/library/ios/qa/qa1668/_index.html你添加了后台模式授权吗? 【参考方案1】:

swift 2+ 解决方案:

do 
  try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
  try AVAudioSession.sharedInstance().setActive(true)
 catch _ 
  return print("error")

【讨论】:

使用catch _ 打印“错误”就像不使用错误处理。为了获得更好的答案,您可以添加捕获的错误本身的打印。 :) @HardikThakkar 你可以在这里写代码 catch _ // 你的错误处理代码 【参考方案2】:

打开您的应用程序 info.plist 作为源代码(以文本模式编辑)并在 dict 之后添加以下内容:

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>

【讨论】:

我猜这只是防止我的设备自动锁定?我按照你说的做了,自动锁定没有启动。如果我手动锁定它,声音会立即停止。 设备应该锁定。 UIApplication.sharedApplication().idleTimerDisabled = true 禁用锁屏。关于 UIBackgroundModes 的文档在这里:developer.apple.com/library/ios/documentation/General/Reference/… 嗯,这很奇怪。我试过了,这是我得到的唯一结果。【参考方案3】:

您使用了错误的类别,对于AVAudioSessionCategoryAmbient,这是正常行为“您的音频被屏幕锁定和静音开关静音”。 请改用AVAudioSessionCategoryPlayback

【讨论】:

【参考方案4】:

首先你应该像这样在你的 plist 中添加背景模式:

那么你应该使用 AVAudioSessionCategoryPlayback 会话。像这样:

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

AVAudioSessionCategoryAmbient 在后台不起作用。

【讨论】:

以上是关于Swift:设备锁定时继续播放声音的主要内容,如果未能解决你的问题,请参考以下文章

如何让背景音乐继续播放而我的应用程序在使用 Swift 时仍然播放其声音

在设备锁定时播放 iPod 库中的音频

如何检测 UILocalnotification 声音是不是正在播放

iOS:App停用后闹钟App如何播放声音?

iOS 本地通知不会在锁定屏幕上播放声音

推送通知声音在 iOS8 上不起作用