如何解决即使 iPhone 处于静音状态,AVAudioPlayer 仍在播放环境声音
我有一个 observable 对象,它为我的应用程序提供了在我需要时(重复)播放相同铃声的功能。
问题是它在 iPhone 静音时播放,我无法阻止它。我尽可能多地搜索了谷歌,发现人们建议将音频类别设置为“环境”,但是,这似乎仍然不能解决我的问题。
这是我的 Chime 课程:
class Chime: ObservableObject {
let chimeSoundUrl = URL(fileURLWithPath: Bundle.main.path(forResource: "chime.wav",ofType: nil)!)
private var audioPlayer: AVAudioPlayer?
init() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(.ambient,options: .duckOthers)
try audioSession.setActive(true)
} catch {
print("Failed to activate audio session: \(error.localizedDescription)")
}
do {
audioPlayer = try AVAudioPlayer(contentsOf: chimeSoundUrl)
audioPlayer?.prepareToPlay()
audioPlayer?.volume = 1.0
} catch {
print("Failed to prepare audio player: \(error.localizedDescription)")
}
}
func play() {
audioPlayer?.currentTime = 0
audioPlayer?.play()
}
}
我已经尝试在 Chime 类的 init 函数中、在播放钟声的视图的 onAppear 中的应用程序的顶层以及在 Chime 类的“play”方法中设置音频类别(这实际上导致应用性能问题)- 这些似乎都不起作用。
我真的很感激任何帮助。谢谢
解决方法
不确定您是否在真实设备上尝试过,但这是我的发现:
使用模拟器,如果在打开应用程序时静音开关已经处于活动状态,它的行为就好像它没有处于静音状态并且声音播放。如果在应用程序打开后激活静音开关,它会按预期工作。
当我尝试在真实设备上运行它时,它在两种情况下都能正常工作,所以可能是模拟器中的错误。
如果您只是播放简短的警报类型的声音,您可能应该使用 Audio Services 而不是 AVAudioPlayer。这可能看起来像这样:
class Chime {
let chimeSoundUrl = URL(fileURLWithPath: Bundle.main.path(forResource: "alert.mp3",ofType: nil)!)
let chimeSoundID: SystemSoundID
init(){
var soundID:SystemSoundID = 0
AudioServicesCreateSystemSoundID(chimeSoundUrl as CFURL,&soundID)
chimeSoundID = soundID
}
func play(){
AudioServicesPlaySystemSound(chimeSoundID)
}
}
在模拟器中运行以上代码,静音开关没有任何效果,声音始终播放,在真实设备上它按预期工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。