首先,为了在后台播放声音,您的应用程序必须能够在后台启动响应回调事件的相关代码。仅允许特定应用类型在后台响应回调事件。例如,“Tile”应用程序可以在后台播放声音,以响应应用程序在后台时触发的 BLE 相关回调事件(例如,BLE 外围设备连接和断开连接)。相反,当应用程序进入后台时,一个简单的计时器会暂停,因此不会触发计时器到期回调,并且在这种情况下无法启动任何代码来播放声音。 (您可以阅读here 了解一些详细信息以及在 iOS 中构建闹钟的可能方法)
如果您的应用程序类型在一组特殊的后台模式应用程序中,即使手机处于静音模式,您也可以使用 AVAudioPlayer 在后台播放响应事件的声音。在您的视图控制器中导入 AVFoundation 框架:
import AVFoundation
比声明一个 AVAudioPlayer 变量
var player: AVAudioPlayer?;
为了播放放在 app bundle 中的 mp3 文件:
func playSound() {
guard let url = Bundle.main.url(forResource: "MY_MP3_FILE", withExtension: "mp3") else {
print("error");
return;
}
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.mixWithOthers);
player = try AVAudioPlayer(contentsOf: url);
guard let player = player else {
print("error");
return;
}
player.play();
} catch let error {
print(error.localizedDescription);
}
}
重要提示:在 Xcode 中的“功能”选项卡中,您还必须启用“音频、AirPlay 和画中画”功能在“后台模式”部分。
(Swift 4 解决方案在不同 iPhone 型号的 iOS 11 和 12 中进行了测试)。
警告:按照这种方法,声音将以手机中设置的当前音量播放,因此如果音量为零,则不会播放声音。您可以通过编程方式将音量设置为给定值in this way:
let volumeView = MPVolumeView();
if let view = volumeView.subviews.first as? UISlider{
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.01) {
view.value = 0.5; //Set the volume level between 0 and 1
}
}
但是,请考虑到这种方法会显示系统音量条,并且可能会导致糟糕的用户体验。