解散 AVPlayerViewController 后如何恢复其他应用程序的音频播放?
How to resume audio playing of other apps after dismissing AVPlayerViewController?
我使用 AVPlayerViewController
在我的应用程序中播放短视频。
如果用户在我的应用中播放视频之前有一个应用在后台播放音频,我希望在我的视频播放器关闭后继续播放另一个应用的背景音频。我目前使用 AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)
来做到这一点。
尽管苹果的音乐应用程序和播客应用程序在我调用后恢复播放 AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)
——没有调用就不会继续播放所以这意味着这个调用确实有效——第 3 方的none我测试过的音乐或播客应用程序(Spotify、SoundCloud、Amazon Music、Overcast)可以。
这是我的代码:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// I know it's not the best place to call setActive nor it covers all the cases. It's just a convenient place to put the code to test its effect after dismissing the video player.
do {
try AVAudioSession.sharedInstance().setActive(false, with: .notifyOthersOnDeactivation)
} catch {
print(error)
}
}
@IBAction func play(_ sender: Any) {
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
let playerController = AVPlayerViewController()
playerController.player = AVPlayer(url: URL(string: "http://gslb.miaopai.com/stream/UkjiD45ddxZFQ79I2bLaGg__.mp4")!)
playerController.player?.play()
present(playerController, animated: true)
}
起初我认为这可能是这些第 3 方应用程序的问题。但后来我用官方推特应用程序测试了它们,发现它们可以在推特应用程序播放视频后恢复音频播放。
那么我错过了什么?我应该怎么做才能让这些第 3 方应用在我的应用中播放视频后恢复音频播放,就像 Twitter 应用一样?
PS:这里是完整的project所以有兴趣的人可以试试。
您需要实施 AVAudioSession 通知。
.对于每次中断或当您的应用播放完媒体文件时,它会触发通知,您可以从那里从设备库恢复已经暂停的媒体文件。
I want the background audio playing of the other app to resume after my video player is dismissed
你需要接受这不取决于你。 you 所能做的就是妥善管理您的音频会话。其他应用 "takes the hint" 是否恢复其音频不在您的控制范围内。
但是,您没有完全正确地管理您的音频会话。你应该:
一般使用无干扰的类别(例如环境光)。
更改为您的播放类别并激活它仅在您需要时(即仅当我们真正要播放时)
播放完毕后,使用 notifyOthersOnDeactivation
停用,然后 切换回无干扰的音频类别(例如环境音),然后激活它。
一旦你完成了这些事情,你就已经完成了所有你能做的。有些应用会恢复,有些则不会。
现在我可以确认这是一个错误:https://openradar.appspot.com/31733529。并且此错误已在 iOS 11.
中修复
我使用 AVPlayerViewController
在我的应用程序中播放短视频。
如果用户在我的应用中播放视频之前有一个应用在后台播放音频,我希望在我的视频播放器关闭后继续播放另一个应用的背景音频。我目前使用 AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)
来做到这一点。
尽管苹果的音乐应用程序和播客应用程序在我调用后恢复播放 AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)
——没有调用就不会继续播放所以这意味着这个调用确实有效——第 3 方的none我测试过的音乐或播客应用程序(Spotify、SoundCloud、Amazon Music、Overcast)可以。
这是我的代码:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// I know it's not the best place to call setActive nor it covers all the cases. It's just a convenient place to put the code to test its effect after dismissing the video player.
do {
try AVAudioSession.sharedInstance().setActive(false, with: .notifyOthersOnDeactivation)
} catch {
print(error)
}
}
@IBAction func play(_ sender: Any) {
do {
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
let playerController = AVPlayerViewController()
playerController.player = AVPlayer(url: URL(string: "http://gslb.miaopai.com/stream/UkjiD45ddxZFQ79I2bLaGg__.mp4")!)
playerController.player?.play()
present(playerController, animated: true)
}
起初我认为这可能是这些第 3 方应用程序的问题。但后来我用官方推特应用程序测试了它们,发现它们可以在推特应用程序播放视频后恢复音频播放。
那么我错过了什么?我应该怎么做才能让这些第 3 方应用在我的应用中播放视频后恢复音频播放,就像 Twitter 应用一样?
PS:这里是完整的project所以有兴趣的人可以试试。
您需要实施 AVAudioSession 通知。 .对于每次中断或当您的应用播放完媒体文件时,它会触发通知,您可以从那里从设备库恢复已经暂停的媒体文件。
I want the background audio playing of the other app to resume after my video player is dismissed
你需要接受这不取决于你。 you 所能做的就是妥善管理您的音频会话。其他应用 "takes the hint" 是否恢复其音频不在您的控制范围内。
但是,您没有完全正确地管理您的音频会话。你应该:
一般使用无干扰的类别(例如环境光)。
更改为您的播放类别并激活它仅在您需要时(即仅当我们真正要播放时)
播放完毕后,使用
notifyOthersOnDeactivation
停用,然后 切换回无干扰的音频类别(例如环境音),然后激活它。
一旦你完成了这些事情,你就已经完成了所有你能做的。有些应用会恢复,有些则不会。
现在我可以确认这是一个错误:https://openradar.appspot.com/31733529。并且此错误已在 iOS 11.
中修复