You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:54:05