如何取消或停止客户端的推送通知?

我有一个网络服务器,它向客户端发送推送通知。 客户端可以在iOS 10上使用UNNotificationServiceExtension拦截推送通知并更改内容。 现在我想取消在某些通知中在客户端显示的推送通知。 我怎么做? 我试着这样做

 self.contentHandler(nil); 

但它不起作用。 怎么做?

它看起来可能不可能,但不确定。 来自文档:

您可以修改原始请求中的任何内容。 您可以为当前用户自定义内容或完全替换它。 您可以使用此方法下载图像或电影,并将其作为附件添加到内容中。 您也可以修改警报文本,只要不删除它即可。 如果内容对象不包含任何警报文本,系统将忽略您的修改并提供原始通知内容。

https://developer.apple.com/reference/usernotifications/unnotificationserviceextension/1648229-didreceivenotificationrequest?language=objc

用nil调用块只显示原始通知?

我不认为这是可能的。 原因如下。 一旦服务器向客户端发送推送通知给Apple APNS服务器以将其发送给客户端,您将失去对推送通知的控制。 这是苹果并不总是承诺100%传递通知的原因之一。 这隐含地告诉您iPhone上的推送通知由iPhone操作系统而不是您的应用程序处理。

甚至Apple iPhone Springboard /仪表板中显示的推送通知也不在您的控制之下。

用户可以控制是否要接收通知。

因此,我不认为您可以在从服务器发送通知后部分控制通知。

我认为最简单的方法是默认情况下将每个推送通知作为静默通知发送,并仅显示您要显示的通知。 当您收到静默通知时

 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) 

您检查通知并确定是否应将其显示给用户。 如果没有,你什么也不做。 如果需要显示,则创建本地通知并显示UILocalNotification(iOS 9及更早版本)或UNNotification(iOS 10)。

我应该添加这个缺点,如果应用程序没有驻留在内存中,则不会显示任何通知(因为应用程序需要将静默通知发送到本地通知中),但是如果你采取相反的机智则会遇到问题可能会显示不应显示的内容。

在iOS 10及更高版本上,您可以向您发送“静音”通知:

Apple doc:配置静默通知

然后您可以决定是否应该向用户显示通知,如果是,只需创建用户通知并显示它:

Apple doc:本地和推送通知