我正在开发可以提醒用户注意某些重要事情的应用。我使用本地通知来提醒用户。在iOS上,我发现如果手机处于振动状态,通知将不会响铃。对于应用程序的许多用户来说这是一个交易破坏者,但我一直把这个问题放到现在,因为我认为如果应用程序在后台,iOS不允许应用播放声音。
音乐应用程序即使在手机处于振动状态时也可以通过启用音频背景模式播放歌曲,但它不允许您安排在特定时间播放歌曲。
最近我看到一些应用程序能够在特定时间播放声音,即使应用程序在后台也是如此。一个这样的应用程序是Alarmy警报应用程序。当警报到期时,我不认为他们正在通过本地通知播放音乐,因为即使在我清除通知后音乐仍继续播放。从本地通知文档中,我了解到在本地通知触发之前我无法运行任何代码,直到用户点击通知为止。所以,我无法启动一个可以在振动中播放声音的音频播放器。
即使手机处于振动状态并且应用程序在iOS中处于后台,此类应用程序如何才能播放声音?
答案 0 :(得分:8)
实现此类功能的方法很少。作为参考,我建议this link.
在设备的振铃开关设置为振动时实际播放声音
首先请确保在功能中包含音频背景模式,以便在后台播放音频。
然后,
Swift 4
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.duckOthers, .defaultToSpeaker])
try AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()
} catch {
NSLog("Audio Session error: \(error)")
}
这里我们将共享音频会话的类别设置为 AVAudioSessionCategoryPlayAndRecord ,以便我们可以播放声音,而设备的振铃开关设置为振动。
指定 .duckOthers 使其他音频更安静,如果有任何可混合音频播放,则可以听到我们的闹钟。如果您喜欢不同的行为,可以将其保留或使用其他选项。
指定了 .defaultToSpeaker ,这样音量就会转到扬声器,声音会大得多,应该可以轻松唤醒用户。
beginReceivingRemoteControlEvents 使得应用程序可以处理远程控制选项,例如锁定屏幕上的播放/暂停按钮,以便我们的用户可以更轻松地将其警报静音醒来。
答案 1 :(得分:1)
完成此操作的方法(我已经在我的应用中实现了此方法)是通过启动AVAudioPlayer并指定播放的特定时间。所以:
在应用程序功能中启用背景音频。
以.playback模式启动和音频会话,并在您喜欢的播放器上启动播放器:
do {
//set up audio session
try AVAudioSession.sharedInstance().setCategory(.playback, options: [.defaultToSpeaker, .duckOthers])
try AVAudioSession.sharedInstance().setActive(true)
//Start AVAudioPlayer
player.play(at: time) //time is a TimeInterval after which the audio will start
}
catch {
...
}
这不会在后台保持沉默,这违反了Apple的规则。它实际上会启动播放器,但音频只会在正确的时间开始。我认为这可能是Alarmy实施其警报的方式,因为它不是触发音频的远程通知,也不是本地通知播放的音频(因为它不限于30秒或被振铃开关静音)。