UNUserNotificationCenter.getDeliveredNotifications始终返回空数组求助
这个问题我之前踩过好几次坑!咱们一步步来排查可能的原因,逐个解决:
1. 先确认通知权限是否到位
getDeliveredNotifications 只有在App获得 通知授权 的前提下才能正常返回数据。如果用户没授权,或者权限状态不对,系统会直接返回空数组。
你可以先加一段代码检查权限状态:
UNUserNotificationCenter.current().getNotificationSettings { settings in let status = settings.authorizationStatus print("当前通知权限状态: \(status.rawValue)") // 只有授权状态为 .authorized(用户明确允许)或 .provisional(临时授权)时,才能访问已投递通知 guard status == .authorized || status == .provisional else { print("没有通知权限,无法获取通知中心的内容") return } // 权限没问题,再调用获取已投递通知 UNUserNotificationCenter.current().getDeliveredNotifications { notifications in print("已投递通知数量: \(notifications.count)") // 可以打印每个通知的标识,确认是否是自己App发的 notifications.forEach { print("通知ID: \($0.request.identifier)") } } }
2. 确认通知中心里的通知确实属于你的App
getDeliveredNotifications 只返回当前App发送的通知,其他App的系统通知、第三方通知都不会被包含在内。你可以打开通知中心,仔细看一下那些显示的通知是不是你的App的图标和名称——别把其他测试App的通知当成自己的了!
3. 排查通知是否被自动/手动清除
如果通知已经被用户手动划掉删除,或者系统因为存储限制自动清理了旧通知,getDeliveredNotifications 自然拿不到。你可以测试一下:刚发送一条通知到通知中心,立刻调用接口,看看能不能拿到。如果刚发的能拿到,过一会儿拿不到,那就是被清理了。
另外,如果你用了 threadIdentifier 给通知分组,用户清除整个线程的话,该组下的所有通知都会被删除。
4. 调整代码调用的时机
有时候在App启动的最早期(比如 application(_:didFinishLaunchingWithOptions:) 里)直接调用 getDeliveredNotifications,系统还没完成和通知中心的同步,会返回空数组。你可以把调用时机往后挪一挪,比如放到 viewDidAppear(_:) 里,或者延迟个几百毫秒再调用试试。
5. 检查是不是静默远程通知
如果是远程通知的话,要注意:静默通知(只有 content-available: 1,没有 alert、badge 等显示内容)不会出现在通知中心,所以 getDeliveredNotifications 肯定拿不到。你要确认远程通知的 payload 里包含了 alert 字段,确保通知会显示在通知中心里。
内容的提问来源于stack exchange,提问作者cauende

