隐藏通过NotificationService Extension收到的通知

Leg*_*man 9 apn apple-push-notifications ios swift

我正在使用NotificationService Extension目标来在推送通知之前修改推送通知.它运行良好,但有一些通知我不想在处理后呈现给用户.

我试图将bestAttemptContent标题和正文设置为"",但它会返回完整的通知.

我也尝试将aps ["content-available"]设置为1,将body设置为""但是我得到了相同的效果.

fre*_*dpi 9

情况

我实际上试图实现与您相同的功能,管理在本地使用通知服务扩展来将特定设备传递给哪种通知.但是,我不得不弄清楚它的设计......

  • ...您无法通过离散api取消通知.
  • ...如果您清空通知的内容,通知将被传递,就像从未调用过通知服务扩展一样.

这是因为Apple不希望您通过通知向用户的手机发送垃圾邮件(即使或者特别是在后台处理甚至没有交付时),因为这可能会耗尽电池寿命,例如

解决方案

您现在有四种可能的选择:

  • 使用无声推送.然后触发本地通知.注意:静音推送并不总是可靠的.
  • 使用VoIP推送.这就是WhatsApp使用的内容,据我所知,它可以允许取消通知.然而,Apple在应用评论方面非常严格:只允许VoIP应用使用VoIP推送(我猜测这就是WhatsApp引入语音呼叫的原因,因为他们需要VoIP推送,以便在通知服务扩展时在后台解密他们的消息在iOS 9下还不是一个选项.
  • 通过仅向应该立即接收这些通知的用户发送通知来处理任何自定义取消逻辑服务器端.
  • 将通知文本操作为非空的内容,但仍隐藏原始通知文本.这可能很有用,如果你发送一个推文,你的应用程序的专业版目前有折扣:对于现有的专业用户,你可以只编辑文本"谢谢你成为专业人士.".

  • 从 iOS 13 开始,VoIP 推送不再是解决方案,因为您在收到 VoIP 推送时必须通过 CallKit 报告新来电。 (3认同)
  • 为这个伟大的答案添加一点: 1. 自 iOS 13.3 以来,出现了新的权利“com.apple.developer.usernotifications.filtering”,允许NotificationExtension过滤通知。您可以为自己索取一份。2. 还有另一个特殊权利“com.apple.developer.pushkit.unrestricted-voip”,它可以让应用程序保留 iOS13 之前的 VoIP 推送行为。截至今天,许多大型应用商店应用程序都在使用它:Signal、Telegram、FB Messenger、Skype、Whatsapp。没有官方途径可以得到它。 (3认同)