macOS下launchUserNotificationUserInfoKey已废弃,如何检测应用是否由点击通知启动
实现方法
macOS 10.14+ 使用UNUserNotification框架后,检测用户点击通知启动/唤醒应用的逻辑不再依赖launchUserNotificationUserInfoKey,而是通过UNUserNotificationCenterDelegate的代理方法实现,核心逻辑如下:
核心步骤
- 必须在
applicationDidFinishLaunching方法最开始就设置通知中心的代理,不要将代理设置放在授权请求的异步回调中,否则冷启动场景会丢失通知点击事件 - 实现
userNotificationCenter(_:didReceive:withCompletionHandler:)代理方法,所有用户点击通知的行为(包括冷启动、后台唤醒)都会触发该方法,在方法内处理启动标记、通知参数解析即可
完整示例代码
class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDelegate { var notificationCenterLaunch = false // 可选:如果需要获取触发启动的通知携带的自定义参数 var launchNotificationUserInfo: [AnyHashable: Any]? func applicationDidFinishLaunching(_ notification: Notification) { // 第一步:优先设置通知中心代理,必须放在最前面 UNUserNotificationCenter.current().delegate = self // 再发起通知授权请求 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { allowed, error in // 处理授权结果 } } // 所有用户点击通知的行为都会触发该代理 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 标记应用是通过点击通知启动 notificationCenterLaunch = true // 读取通知携带的自定义参数 launchNotificationUserInfo = response.notification.request.content.userInfo // 后续处理自定义逻辑,比如跳转到对应页面 completionHandler() } }
注意事项
如果需要区分用户是点击了通知的默认打开按钮,还是点击了通知附带的自定义操作按钮,可以通过response.actionIdentifier判断:
- 值为
UNNotificationDefaultActionIdentifier时代表用户点击了通知主体,触发应用启动/唤醒 - 其他值对应你自定义的通知操作ID
内容的提问来源于stack exchange,提问作者sunknudsen
相关产品推荐
相关产品推荐

