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

10
我正在使用Swift开发一个iOS应用程序,其中包含推送通知功能。该应用通过推送通知(在此处使用APNS)向用户发送生日提醒通知。
目前,推送通知将保留在设备的通知中心中,直到用户点击该通知或选择从设备中清除为止。
现在我正在寻找一种方法,在每天结束时自动删除该推送通知,因为在设备中不需要显示过去一天的生日通知。
有人可以建议我一种解决方案吗?是否可能在没有任何用户交互的情况下从iOS中删除通知?
3个回答

5

这是在应用程序被用户强制终止的情况下的解决方案:

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

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

在此之后,当设备不需要显示通知时,您可以发送一个带有零徽章的静默通知,即使应用程序被用户强制终止,也会清除徽章和通知,但因为应用程序被终止而不会调用didReceiveRemoteNotification

静默推送通知的有效载荷:

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

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

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

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


嘿,这个不起作用。你确定吗?当应用程序被强制关闭时,静默远程通知没有被调用。 - Protocol
当应用程序被杀死时,它当然不会调用任何方法,但它会清除徽章并从通知中心删除推送通知。它完美地工作。 - mhammad alkhalaf
我正在开发一个应用程序,其中实现了呼叫功能。当用户拨打电话时,会向被叫方发送通知。如果他无法接听电话,但通知已经传递到他的设备上,那么我希望在30秒后从被叫方移除通知。 我尝试了你提供的解决方案,但通知没有被移除。请帮我解决这个问题。 - Protocol
首先,在向被叫方发送通知时,请使用带有非零标记的通知(badge)。当您想要从被叫方移除通知时,请发送带有零标记的静默通知("badge": 0)。 - mhammad alkhalaf

4
为了自动从通知中心中删除特定通知,
  • 您无法在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

1
@dm_mobile 您可以关注我的 Medium 主页,深入了解 Swift 和 iOS 相关知识。以下是我发布的一篇有关 Swift 编程的文章链接 https://medium.com/swift-india/design-patterns-by-tutorials-the-power-of-oop-2e871b551cbe - Hitendra Solanki
1
请问我应该用什么方式与APNS服务器通信以删除通知?我过去通常调用“/3/device/<device-token>”来发送推送通知。我应该使用同样的方法吗? - dm_mobile
1
@dm_mobile 当您发送删除通知时,还需要将通知标记为静默通知,使用'aps {}'内的'content-available'=1进行静默通知此外,您还需要启用后台模式,请参阅以下链接:https://files.readme.io/5aWjYMdQz6h0HBOkikvZ_1%20-%20PushNotificationsApp-Info_plist.png - Hitendra Solanki
1
我能够按照你的建议发送静默通知来从设备通知中心删除通知。不幸的是,如果用户强制终止应用程序,静默通知无法执行任何操作(例如删除已传递的通知)。你有什么建议来解决这个问题吗?此外,我注意到像WhatsApp和Outlook这样的应用程序即使被用户强制终止也会自动删除它们的推送通知。 - dm_mobile
@luk2302 在iOS端需要编写代码吗? - Arpit B Parekh
显示剩余4条评论

3
如果有其他人想要清除通知但不发送背景推送,我花了几个小时尝试复制已接受的答案,具体来说:
您可以通过在请求报头中传递apns-id值向APNS发送另一个请求来从设备的通知中心删除该通知。
对我而言并没有起作用。 我所能看出的唯一删除通知的方法是通过content-available后台推送。 虽然我很乐意被证明是错误的!

每小时只有2到3个限制,对吧? - swalkner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接