如何使用Expo SDK获取已发送通知的真实ID?
如何获取Expo通知的真实ID?
我目前用了个临时方案:把通知关联的聊天消息ID放进通知的data字段里,用户在task中接收通知时,向后端发请求,把通知ID和聊天消息ID存入数据库。但这个方案有问题:如果发送方发完消息立刻删除,接收方没激活应用的话,根本没法取消已经发出去的通知。
后端我用expo-server-sdk-node程序化发送通知,每次发送成功会得到一个receipt ID,但这不是通知本身的ID——receipt ID是常规UUID,而通知真实ID的格式是这样的:
0:1703170688617238%397189adf9fd7ecd
所以用dismissNotificationAsync尝试删除通知总是失败,请问有什么办法能获取到通知的真实ID?
解决方案
前端接收通知时捕获真实ID
当应用在前台、后台甚至通过task接收通知时,Expo的通知回调会返回完整的通知对象,其中的identifier字段就是你需要的真实通知ID。你可以在这个环节把该ID和对应的聊天消息ID一起发送给后端存储,这样后端就能拿到有效的通知ID,后续需要删除时可以把ID下发给前端,调用dismissNotificationAsync执行删除。处理已发送通知的撤销限制
需要注意:一旦通知被Expo推送到APNs(iOS)或FCM(Android),后端无法直接撤回这条通知——因为推送服务一旦接收并下发,就无法主动取消。这种场景下,你可以:
- 在后端标记被删除消息对应的通知为「无效」;
- 用户打开应用时,前端遍历本地通知,检查每个通知
data里的聊天消息ID是否对应已删除的消息,若对应则调用dismissNotificationAsync删除该通知。
内容的提问来源于stack exchange,提问作者Mike K
相关产品推荐
相关产品推荐

