Mac端应用通过点击通知启动时如何捕获对应UserNotification内容
Mac端点击通知冷启动应用捕获通知内容解决方案
核心遗漏排查点
- 代理注册时机错误
必须在applicationDidFinishLaunching:执行的最开始阶段(优先于所有其他业务初始化逻辑)完成UNUserNotificationCenter.currentNotificationCenter.delegate的赋值,同时完成通知类别、权限的注册。如果注册时机晚于系统触发通知响应的时间点,didReceiveNotificationResponse回调会被系统直接丢弃,不会触发。 - 误用iOS平台的launchOptions键名
Mac端AppKit框架下,launchOptions中通知对应的键名和iOS不通用:- 远程通知对应键为
NSApplicationLaunchOptionsRemoteNotificationKey - 本地通知对应键为
NSApplicationLaunchOptionsLocalNotificationKey
直接使用iOS的UIApplicationLaunchOptionsRemoteNotificationKey会读取不到值,出现launchOptions返回空的假象。
- 远程通知对应键为
- getDeliveredNotificationsWithCompletionHandler调用时机错误
该接口必须在UNUserNotificationCenter代理注册完成、通知权限申请通过之后调用,提前调用会返回空数组。冷启动场景下调用该接口时,用户点击过的通知只要还未被系统从通知中心清除,就可以正常读取到内容。 - Catalyst适配特殊要求
如果是iOS项目编译为Mac Catalyst应用,需要额外在Signing & Capabilities中添加「Background Modes」能力,勾选「Remote notifications」选项,否则冷启动点击推送通知的事件不会传递到应用层。
验证流程
- 清空应用缓存,完全退出应用
- 触发本地/远程通知后点击通知启动应用
- 在
didFinishLaunchingWithOptions中先打印完整launchOptions字典,确认是否包含通知对应的key - 优先注册通知代理后,等待300ms再调用
getDeliveredNotificationsWithCompletionHandler打印返回结果 - 确认
didReceiveNotificationResponse回调是否在代理注册完成后触发
内容的提问来源于stack exchange,提问作者Lucian Thorr
相关产品推荐
相关产品推荐

