我有一个向客户发送推送通知的网络服务器。客户端可以在iOS 10上使用UNNotificationServiceExtension
拦截推送通知并更改内容。现在我想取消在客户端显示某些通知的推送通知。我怎么做?我试着做
self.contentHandler(nil);
但它不起作用。怎么做?
答案 0 :(得分:3)
看起来可能不可能,但不确定。来自文档:
您可以修改原始请求中的任何内容。你可能会 自定义当前用户的内容或完全替换它。 您可以使用此方法下载图像或电影并将其添加为 内容的附件。您也可以修改警报文本 因为你没有删除它。 如果内容对象不包含任何内容 警报文本,系统忽略您的修改并提供 原始通知内容。
使用nil调用块只显示原始通知?
答案 1 :(得分:0)
我认为不可能。原因如下。一旦服务器向客户端发送推送通知给Apple APNS服务器以将其发送给客户端,您将失去对推送通知的控制。这是苹果并不总是承诺100%传递通知的原因之一。这隐含地告诉您,iPhone上的推送通知由iPhone操作系统而不是您的应用程序处理。
即使是Apple iPhone Springboard /仪表板中显示的推送通知也无法控制。
用户可以控制是否要接收通知。
因此,我不认为您可以在从服务器发送通知后部分控制通知。
答案 2 :(得分:0)
我认为最简单的方法是默认将每个推送通知作为静默通知发送,并仅显示您要显示的通知。当您在
中收到无声通知时func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any])
您检查通知并确定是否应向用户显示。如果没有,你什么也不做。如果需要显示,则创建本地通知并显示UILocalNotification(iOS 9及更早版本)或UNNotification(iOS 10)。
我应该添加它的缺点是,如果应用程序没有驻留在内存中,则不会显示任何通知(因为应用程序需要将静默通知发送到本地通知中),但是如果你采取相反的机智那么你有问题可能会显示出不应该显示的内容。
答案 3 :(得分:0)
在iOS 10及以上版本中,您可以向您发送"无声"通知:
Apple doc: configure silent notification
然后您可以决定是否应该向用户显示通知,如果是,只需创建用户通知并显示它:
答案 4 :(得分:0)
@Jorge Arimany的答案是发送静默通知以唤醒设备以执行某些操作,我认为这不是该用户想要的解决方案。我认为,如果我们在UNNotificationServiceExtension类中不进行任何操作,我们仍然会收到常规通知
答案 5 :(得分:0)
现在可以从 iOS 13.3 开始。您需要将一个空的 UNNotificationContent 传递给 contentHandler(不是 nil)并添加新的过滤权限。
// Determine whether you should suppress the notification.
let suppress = myShouldSuppressNotification(request: request)
if suppress {
// Don't deliver the notification to the user.
contentHandler(UNNotificationContent())
} else { ///...