如何让 iOS VoIP 应用程序在响铃时服从“请勿打扰”?

How to make an iOS VoIP app obey Do Not Disturb when ringing?

人们会认为 VoIP 应用程序必须遵守与股票 phone 应用程序相同的规则,但事实证明要正确实现响铃几乎是不可能的。我试过的几件事:

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

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

    差:声音不能超过30秒,出现通知时只振动一次。因此,为了达到振铃效果,必须重新推送通知,例如每 6 秒,有效地向通知中心发送垃圾邮件。如果应用程序处于活动状态,推送通知也不会 sound/vibrate,因此应用程序必须检测到它并以不同的方式响铃。

  2. AudioServicesPlayAlertSound().

    好:合适API貌似是专门为这个任务设计的。服从静音模式。

    差:完全无视免打扰模式,声音和振动直接传来

  3. 使用AVFoundation播放铃声

    声音播放。

    不好:不支持震动,不支持silent/DND模式。基本上不能用作铃声。

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

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

它的问题都可以解决。

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

[[UIApplication sharedApplication] cancelAllLocalNotifications];

振动问题:你应该可以调用这个:AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);在你用定时器一遍又一遍地调用本地通知的同一个地方,直到呼叫结束或用户确认呼叫。开启VOIP后台设置后,应该可以在后台运行。

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

祝你好运。