首先,为了在后台播放声音,您的应用程序必须能够在后台启动响应回调事件的相关代码。仅允许特定的应用程序类型在后台响应回调事件。例如,“Tile”应用程序可以在后台播放声音,以响应当应用程序处于后台时触发的 BLE 相关回调事件(例如,BLE 外围设备连接和断开连接)。相反,当应用程序进入后台时,简单的计时器会被挂起,因此计时器到期回调不会被触发,并且在这种情况下无法启动任何代码来播放声音。 (你可以阅读here https://oleb.net/blog/2014/02/alarm-clock-apps-ios/了解一些细节以及在 iOS 中构建闹钟的可能方法)
如果您的应用程序类型属于特殊后台模式应用程序集,则即使手机处于静音模式,您也可以使用 AVAudioPlayer 播放响应后台事件的声音。在视图控制器中导入 AVFoundation 框架:
import AVFoundation
比声明一个 AVAudioPlayer 变量
var player: AVAudioPlayer?;
为了播放应用程序包中的 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 解决方案在 iOS 11 和 12 中使用不同的 iPhone 型号进行了测试)。
Warning:按照此方法,声音将以手机中设置的当前音量播放,因此如果音量等于零,则不会播放声音。您可以通过编程将音量强制设置为给定值这样 https://stackoverflow.com/a/50740234/2610888:
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
}
}
但是,请考虑到这种方法会显示系统音量条,可能会导致不良的用户体验。