【问题标题】:How to make an iOS VoIP app obey Do Not Disturb when ringing?如何让 iOS VoIP 应用在响铃时遵守请勿打扰?
【发布时间】:2015-04-22 07:13:07
【问题描述】:

人们会认为 VoIP 应用程序必须遵守与普通电话应用程序相同的规则,但事实证明要正确实现振铃几乎是不可能的。我尝试了几件事:

  1. 带有铃声的本地推送通知。

    良好:同时遵守静音和免打扰模式。

    不好:声音不能超过30秒,而且只有在通知出现时振动一次。因此,要实现振铃效果,必须重新推送通知,例如每 6 秒,有效地向通知中心发送垃圾邮件。此外,如果应用处于活动状态,推送通知也不会发出声音/振动,因此应用必须检测到这一点并以不同的方式响铃。

  2. AudioServicesPlayAlertSound().

    好:似乎是专门为此任务设计的适当 API。服从静音模式。

    糟糕:完全忽略了勿扰模式,声音和振动直接通过。

  3. 使用AVFoundation 播放铃声。

    很好声音播放。

    不好:不支持振动,不支持静音/免打扰模式。基本上不能用作铃声。

有没有更好的方法?还是 Apple 完全错过了这个用例?

【问题讨论】:

    标签: ios audio voip hig


    【解决方案1】:

    正如您在 3 个选项中所说,只有 UILocalNotification 实际上遵循静默/DND 模式。

    它的问题可以解决。

    向通知中心发送垃圾邮件:我认为这很有效。您可以在启动新通知之前立即取消之前的通知,因此始终只有 1 个未完成的通知。

    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    振动问题:您应该可以在同一个地方调用:AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);,使用计时器一遍又一遍地调用本地通知,直到通话结束或用户确认称呼。启用 VOIP 背景设置后,它应该可以在后台运行。

    正如您在选项 2 中所述,振动不会遵循免打扰模式,而只是振动。如果您向通知中心发送垃圾邮件,通知中心会在每次收到通知时振动一次,因此您可能不需要明确开始振动,如果这对您来说已经足够了。

    祝你好运。

    【讨论】:

    • 我接受您的回答,因为这正是我们最终实现它的方式。我们也让通知振动,这样它甚至在免打扰中也不会振动。我希望有一个更好的答案。这显然是一个 hack。
    • 我们实施了 teradyl 描述的解决方案。当应用程序在后台时,这非常有用。但是,如果应用程序位于前台,则通知不会振动或播放声音。因此,我们在应用程序中捕获通知(应用程序:UIApplication,didReceiveLocalNotification 通知:UILocalNotification)并使用 AudioServicesPlayAlertSound() 播放声音。但是,当用户应答时,声音将继续通过听筒播放,直到 wav 文件完成。我找不到停止播放的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多