如何在特定时间从 iOS 通知中心自动删除推送通知?

Posted

技术标签:

【中文标题】如何在特定时间从 iOS 通知中心自动删除推送通知?【英文标题】:How to automatically delete push notifications from iOS notification centre at a specific time? 【发布时间】:2019-04-12 07:02:19 【问题描述】:

我正在使用具有推送通知功能的 Swift 开发 ios 应用程序。该应用通过推送通知(此处使用的 APNS)向用户发送生日提醒通知。

目前,推送通知会保留在设备的通知中心,直到用户点击该通知或选择从设备中清除它。

现在我正在寻找一种在每天结束时自动删除推送通知的方法,因为不需要在设备中显示过去一天的生日通知。

有人可以建议我一个解决方案,我可以通过哪种方式实现它?是否可以在没有任何用户交互的情况下从 iOS 中删除通知?

【问题讨论】:

【参考方案1】:

这适用于应用被用户强行终止的情况:

当您想通过推送通知向用户发送生日提醒通知时,首先发送非零徽章,例如:

 
  "aps": 
    "alert": 
      "title": "Hey! Urgent Reminder",
      "body": "Do not forget my wife SURPRISE BIRTHDAY PARTY"
    ,
    "badge": 1
  
 

之后,当不需要在设备中显示通知时,您可以发送带有零标记的静默通知,即使应用强制终止也会清除标记和通知strong> 由用户调用,但不会调用 didReceiveRemoteNotification,因为应用程序已终止。 静默推送通知的有效负载:

 
   "aps" : 
      "content-available" : 1,
        "badge" : 0,
        "Priority" : 10
   

发送该有效负载后,将自动清除徽章并从通知中心删除推送通知。

请注意,如果在发送静默通知之前徽章为零,则不会清除通知。

https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CreatingtheNotificationPayload.html

【讨论】:

嘿,这行不通。你确定吗,当应用程序被强行杀死时,不会调用静默远程通知。 当然,当应用程序被杀死时它不会调用任何方法,但它会清除徽章并从通知中心删除推送通知。它完美地工作 我正在开发一个应用程序,其中实现了呼叫功能。当用户呼叫该时间通知被发送给被呼叫者。如果他无法接听电话,但通知会在他的设备上发送。那个时候我想在 30 秒后从被叫方删除通知。我尝试了您的解决方案,但通知未删除。请帮帮我 当您想向被调用者发送通知时,首先发送带有徽章(非零徽章)的通知。当您想从被调用者那里删除通知时,发送带有零徽章的静默通知(“徽章”:0)【参考方案2】:

为了自动从通知中心删除特定通知,

您不能从 iOS 端执行此操作,除非用户与该通知进行交互 但是,你可以从服务器端做到这一点,让我告诉你如何

如何以编程方式从通知中心删除通知? 当服务器使用 APNS 端点通过 APNS 服务器向您发送任何通知时,APNS 将向您返回一些数据作为有效负载,您将在响应标头中以 apns-id 键的形式获得通知标识符

apns-id 值存储在服务器端的数据库表中。

在一天结束时或根据特定条件条件,您可以通过在请求标头中传递 apns-id 值向 APNS 发送另一个请求,从设备的通知中心删除该通知。

Skype 也在做同样的事情。

阅读本文了解更多详情:https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html#//apple_ref/doc/uid/TP40008194-CH11-SW1

【讨论】:

@dm_mobile 你可以关注我的 medium profile 来深入了解 Swift 和 iOS,这里是我的一篇关于 Swift 编程的文章的链接medium.com/swift-india/… 您能告诉我,我应该以哪种方式与 APNS 服务器通信以删除通知?我曾经调用“/3/device/”来发送推送通知。我应该使用相同的方法吗? @dm_mobile 点击此链接:developer.apple.com/library/archive/documentation/… :path - /3/device/ 将“apns-id”作为标头参数传递 @dm_mobile 您还需要在发送删除时将通知标记为静默通知,对于静默通知使用 'content-available' = 1 inside aps 您还需要启用后台模式检查这个:files.readme.io/… 我可以按照您的建议通过发送静默通知从设备通知中心删除通知。不幸的是,如果应用程序被用户强行终止,静默通知将无法执行任何操作(例如删除传递的通知)。你有什么建议可以解决这个问题吗?另外,我注意到 Whatsapp 和 Outlook 等应用程序会自动删除其推送通知,即使该应用程序被用户强行终止。【参考方案3】:

如果其他人最终在这里寻找一种在不发送后台推送的情况下清除通知的方法,我花了几个小时尝试复制接受的答案,特别是:

您可以通过在请求标头中传递 apns-id 值向 APNS 发送另一个请求,从而从设备的通知中心删除该通知。

它对我根本不起作用。据我所知,删除通知的唯一方法是通过内容可用的后台推送。虽然我很想被证明是错误的!

【讨论】:

那些限制为每小时 2 或 3 个,对吧?

以上是关于如何在特定时间从 iOS 通知中心自动删除推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 从通知中心删除推送通知

应用打开后从通知中心移除推送

Detox:如何使用 detox 在通知中心点击 iOS 推送通知

如何将原始推送通知从 Azure 通知中心发送到 iOS 设备?

为啥通知会自动从 iOS 通知中心移除?

如何在 iOS 的 Azure 移动应用通知中心注册目标推送通知