当应用程序在后台并且手机处于振动状态时,一些闹钟应用程序(例如 Alarmy)如何能够在 iPhone 上播放声音

Posted

技术标签:

【中文标题】当应用程序在后台并且手机处于振动状态时,一些闹钟应用程序(例如 Alarmy)如何能够在 iPhone 上播放声音【英文标题】:How are some alarm apps such as Alarmy able to play a sound on iPhone when the app is in the background and the phone is on vibrate 【发布时间】:2018-11-11 16:29:56 【问题描述】:

我正在开发可以提醒用户一些重要事情的应用程序。我使用本地通知来提醒用户。在 ios 上,我发现如果手机处于振动状态,通知将不会响起。对于该应用程序的许多用户来说,这是一个大问题,但我一直把这个问题搁置到现在,因为我认为如果应用程序在后台,iOS 不允许应用程序播放声音。

通过启用音频背景模式,即使手机处于振动状态,音乐应用也可以播放歌曲,但它不允许您安排在特定时间播放歌曲。

最近我看到一些应用程序能够在特定时间播放声音,即使应用程序在后台。一个这样的应用程序是Alarmy 警报应用程序。我认为警报到期时他们不会通过本地通知播放音乐,因为即使在我清除通知后音乐仍在继续播放。从本地通知文档中,我了解到当本地通知触发时,我无法运行任何代码,直到用户单击通知。所以,我无法启动一个可以振动播放声音的音频播放器。

即使手机处于振动状态并且应用程序在 iOS 中处于后台,这些应用程序如何能够播放声音?

【问题讨论】:

这个链接可能会有所帮助:***.com/questions/24145386/… 【参考方案1】:

实现这种功能的方法很少。作为参考,我推荐this link.

在设备的铃声开关设置为振动时实际播放声音

首先确保在功能中包含音频背景模式,以便在后台播放音频。

那么,

斯威夫特 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 使应用程序可以处理远程控制选项,例如锁定屏幕上的播放/暂停按钮,以便我们的用户更容易将他们的警报静音,一旦他们醒来。

【讨论】:

当应用程序在后台运行时,如何安排音乐在特定时间开始?该链接建议为不需要的应用禁用多任务模式。 @VarunGupta,您最初的问题“当应用程序在后台并且手机处于振动状态时,一些警报应用程序(例如 Alarmy)如何在 iPhone 上播放声音”不需要这个答案.为此创建一个单独的。 如果你阅读了这个问题,你会发现这是我在答案中寻找的东西之一。我还在“你在赏金中寻找什么”部分中提到了它作为“我正在寻找一种能够在 iOS 中的某个时间点播放声音的方法”。但我明白你的意思,我在写该部分的标题时也需要更加小心。 @VarunGupta,好的,对不起,我一开始没有注意到赏金描述,但如果你能编辑你的问题并将所有问题包含在一个编号列表中,那就太好了。它将帮助人们更好地了解您。我会看看这个。 谢谢@T.Pasichnyk。我会看看回购。不希望禁用多任务模式的原因是因为一旦用户将应用程序置于后台,应用程序将完全停止并且不会响起任何警报。【参考方案2】:

可以通过启动 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 秒或被铃声开关静音)。

【讨论】:

这是一个很棒的设置。当手机处于后台模式时,您是如何播放音频的? 和上面写的一模一样。在应用程序功能中添加背景音频。然后只需启动一个 AVAudioPlayer,它会在应用程序后台播放时继续播放。 大家请注意,您必须启用.mixWithOthers.duckOthers(这也会自动启用.mixWithOthers),否则如果您打开另一个有音频的应用程序,它将停用您的背景应用程序的音频会话。启用此选项可确保它仍然可以播放(即它可以“与其他人混合”)。 我现在不知道这是否与较旧的 switf 版本不同,但 player.play 作为参数 atTime 而不是 at,它指定应该在哪一秒开始播放音频文件,它不回答如何在预定的日期/时间开始播放音频的问题。

以上是关于当应用程序在后台并且手机处于振动状态时,一些闹钟应用程序(例如 Alarmy)如何能够在 iPhone 上播放声音的主要内容,如果未能解决你的问题,请参考以下文章

即使手机处于静音或振动状态,如何让视频播放声音? [复制]

当手机处于锁定状态时,我可以用一些手势启动应用程序吗? [关闭]

如何在配置文件处于振动模式时使手机振动或在配置文件处于静音模式时从不响铃并在响铃模式下响铃

当应用程序处于活动状态时,phonegap 通用推送 ios 警报

当应用程序从后台处于活动状态时,如何避免在本机反应中安装组件?

从睡眠模式唤醒时不会播放音频(android)