Swift 显示前取消推送通知

Swift Cancel Push Notification Before Showing

我用 Swift 为 IOS 10.2 开发了一个应用程序。我使用来自服务器的 Apple Push Notification。在此应用程序中,我使用 UserDefaults 进行用户设置。
我希望如果用户想要接收当天的新闻,我的应用程序允许显示新闻类别的推送通知。因此,我可以在向用户显示之前管理推送通知吗?
我必须在服务器上保留设置吗?有什么建议吗?谢谢

Apple在iOS10中引入了Notification Service Extension,您可以使用这个扩展来修改APNS发送的通知内容。此扩展允许您在向用户显示之前下载 image/video/gif 内容或修改通知的内容,如标题、副标题、描述。但是,您不能完全取消通知。

虽然如果您将通知设置保存在 Suite UserDefaults 中(通过使用 AppGroups),您可以在通知服务扩展中访问这些设置,并且在阅读设置后您可以将通知的内容更改为一般通知并使用 API 将通知设置发送到您的外部服务器并停止向客户端发送该特定通知。但是,是的,cancelling/stopping 特定通知的逻辑必须写在服务器上。

希望对您有所帮助。

Apple 通知团队有时(几乎每次)都会做出一些相当愚蠢的决定,如:

  • 具有操作按钮和 通知内容扩展,导致大量不必要的 系统上注册类别标识符的笛卡尔积。

  • 初始触发日期 从 iOS 10 中的新 UNNotificationTrigger 中移除 或更高。

  • 正在创建 UNPushNotificationTrigger 并丢失所有其他触发器
    推送的 UNNotificationTrigger 功能
    通知。

...和无法使用通知服务扩展取消推送通知 就是一个很好的例子。为什么不在使用 Notification Service Extension 向用户显示之前取消无效或损坏的推送通知?

对此没有其他有效的解释,但开发团队痴呆或恶意。

但是您可以“控制系统”!是的!!!

构建一个无效且空的通知内容并将其发送回通知服务进行消化并窒息而死。 在你的 UNNotificationServiceExtension 中:

public override func didReceive(
    _ request: UNNotificationRequest,
    withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
){
    self.contentHandler = contentHandler
    self.content = (request.content.mutableCopy() as? UNMutableNotificationContent)
    
    if let content = content {
        
        print("Valid FCM received")
        contentHandler(content)
    }
    else {
    
        // Invalidates the notification
        print("Invalid FCM received")
        contentHandler(UNNotificationContent())
    }
}

大哥拿去