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

Posted

技术标签:

【中文标题】如何取消或停止来自客户端的推送通知?【英文标题】:How can I cancel or stop push notification from a client? 【发布时间】:2016-10-19 03:53:07 【问题描述】:

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

self.contentHandler(nil);

但它没有用。怎么做?

【问题讨论】:

在通知文档 (developer.apple.com/library/content/documentation/…) 中,您可以看到上面写着 To support silent remote notifications, add the remote-notification value to the UIBackgroundModes array in your Info.plist file. @dlbuckley 但我确实希望显示一些通知。我希望由客户端而不是服务器来决定。据我所知,制作一些静音通知是不可能的,所以我想看看我是否可以让一些常规通知静音。 啊,那样的话我不太确定。 iOS 10 通知更改在我的列表中值得关注,抱歉! 只是一个想法(还没有亲自尝试过),您是否尝试过从服务器发送静默通知,然后让应用在需要时创建本地通知? 这是正确的答案 JRG-Developer 【参考方案1】:

看起来这可能是不可能的,但不确定。来自文档:

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

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

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

【讨论】:

【参考方案2】:

我认为最简单的方法是默认将每个推送通知作为静默通知发送,并且只显示您想要显示的通知。当您在

中收到静默通知时
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any])

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

我应该补充一点,如果应用程序不驻留在内存中,则不会显示任何通知(因为应用程序需要将静默通知变成本地通知),但如果你采取相反的策略,那么你有一些问题可能会显示不应该显示的内容。

【讨论】:

这行不通。 “通知服务应用程序扩展仅在配置为向用户显示警报的远程通知上运行。如果您的应用程序禁用警报,或者如果有效负载仅指定播放声音或标记图标,则扩展是没有工作。” developer.apple.com/documentation/usernotifications/…【参考方案3】:

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

Apple doc: configure silent notification

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

Apple doc: local and push notifications

【讨论】:

【参考方案4】:

@Jorge Arimany 的回答是发送静默通知以唤醒设备做某事,我认为这不是该用户想要的解决方案。而且我认为,如果我们在 UNNotificationServiceExtension 类中什么都不做,我们仍然会收到一般通知

【讨论】:

【参考方案5】:

现在可以从 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  ///...

参考:https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_usernotifications_filtering

【讨论】:

【参考方案6】:

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

即使是 Apple iPhone 跳板/仪表板中显示的推送通知也不受您的控制。

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

所以我不认为你可以在通知从你的服务器发送后部分控制它。

【讨论】:

这在 iOS 10 之前曾经是这种情况,但在 iOS 10 中,您当然可以在将其发送到 APNS 后采取行动。您甚至可以使用 UNNotificationServiceExtension 更改内容。那么问题来了,如果可以更改内容,为什么可以直接取消呢?将内容更改为 nil 没有帮助。

以上是关于如何取消或停止来自客户端的推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

来自 MobileFirst 服务器的安全或加密推送通知消息

停止计划的推送通知在反应本机推送通知中

用户在屏幕聊天时如何取消本地推送通知?

如何在我的 iPhone 应用程序中显示来自服务器端的推送通知

使用 MobileFirst 的基于位置的推送通知

如何接收应用程序停止或设备关闭时发送的 GCM 推送通知?