gpt4 book ai didi

ios - iOS 如何清除远程推送通知?

转载 作者:行者123 更新时间:2023-12-01 19:26:37 24 4
gpt4 key购买 nike

所以我一直在阅读远程通知,并终于让它发挥作用;我们的应用程序正在接收来 self 们服务器的通知。现在,如果我们的服务器满足特定条件(例如通知不再有效),我们希望删除或更新未读通知。我知道“静默”通知是唯一的方法,但我仍然对如何做到这一点感到困惑。如果无声通知触发我的应用程序唤醒,我将能够安排本地通知,但我能够删除现有的远程通知吗?

这是专门使用来自服务器的静默通知并将所有通知安排为带有自定义标识符(稍后可以删除)的本地通知的唯一解决方案吗?例如,如果我想要此功能,我可以永远不使用从服务器到设备的“即发即忘”远程推送通知吗?

编辑:此应用程序支持低至iOS 9:/

最佳答案

我最终按照 his answer 中建议的 TawaNicolas 那样做了。 ,通过使用 getDeliveredNoti... 获取收到的通知,然后检查每个通知的 userInfo 以查找我想要删除的通知。我将可移动通知的标识符存储在一个数组中,并调用 removeDelivered...

这正是他的回答所暗示的,但一开始这不起作用,我很难找出原因。我仍然不完全确定我已经修复了它,但我的测试表明它正在工作 - 而且我的解决方案有些道理。

问题是,在 didReceiveRemote.. 函数内部,您必须在最后调用 completionHandler(.newData) 。这是为了通知通知中心某些内容发生了变化。我开始怀疑这个回调是在可移动通知实际被删除之前调用的。我检查了文档,removeDeliveredNotifications 确实是异步的。这意味着当我这样做时:

UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: removableIDs)
completionHandler(.newData)

不保证第一个函数在调用第二个函数之前完成。这意味着告诉我的NotificationCenter某些内容已更新的completionHandler首先完成,然后通知从系统中删除。 (NotificationCenter 显然不会在该函数之后调用自己的completionHandler 来更新UI)。

这一切可能会发生,也可能不会发生。正如我所经历的;连接到调试器时,removeDeliveredNotifications 函数速度非常快,总是在调用 completionHandler 之前完成,这意味着通知在更新系统之前已被删除。所以开发这个时一切看起来都很棒。当我与调试器断开连接时,removeDeliveredNotifications 函数稍微慢一些,并且由于它是异步的,因此它在我调用 completionHandler 之后完成 -导致系统更新太快。

解决这个问题的最佳方法是 Apple 为我们提供一个用于 removeDeliveredNotifications 的completionBlock,并在其中调用我们的 completionHandler,但他们没有这样做。

为了解决这个问题,我现在添加了 0.2 秒的固定延迟。它可能会低于 0.2,但对于我们正在做的事情来说,一秒 from 或 to 并不重要。

这是我创建的一个类和函数,可以轻松地从任何地方延迟某些事情:

class RuntimeUtils{
class func delay(seconds delay:Double, closure:@escaping ()->()){
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay*Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}
}

在这里,我在 AppDelegate 中的 didReceiveRemoteNotification: 中使用它:

UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: removableIDs)
RuntimeUtils.delay(seconds: 0.2, closure: {
completionHandler(.newData)
})

将这个延迟添加到completionHandler后,它总是在我删除通知后执行,并且似乎每次都有效,无论是否连接了调试器。

这是一个令人厌恶的问题,修复方法也很糟糕。

关于ios - iOS 如何清除远程推送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46689396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com