为什么部分NSWorkspace通知的userInfo为nil?如何标准化处理这类通知?
NSWorkspace通知userInfo差异原因及标准化处理方案
差异原因
NSWorkspace的通知设计遵循「仅在需要时传递额外上下文」的原则:
didActivateApplicationNotification触发时,核心关联数据是被激活的应用实例,系统需要将该NSRunningApplication对象传递给观察者,因此通过userInfo的固定字段NSWorkspaceApplicationKey返回,属于官方预设的标准设计activeSpaceDidChangeNotification仅表示「桌面空间切换完成」的事件,不存在必须随通知传递的额外数据,观察者如果需要当前空间的相关属性,直接调用对应系统API查询即可,因此系统没有为该通知附加userInfo字典
标准化处理方案
所有NSWorkspace通知都可以按照以下统一逻辑处理,避免异常:
- 开发前优先查阅官方文档,确认对应通知是否携带
userInfo、以及userInfo的固定字段定义,不要依赖运行时打印的临时结构做开发依据 - 处理
userInfo时必须做非空判断和类型校验,避免数据异常导致崩溃:
@objc func handleWorkspaceNotification(notification: NSNotification) { switch notification.name { case NSWorkspace.didActivateApplicationNotification: // 校验userInfo和字段类型 guard let userInfo = notification.userInfo, let activatedApp = userInfo[NSWorkspaceApplicationKey] as? NSRunningApplication else { return } // 处理应用激活逻辑 print("激活应用:\(activatedApp.localizedName ?? "未知")") case NSWorkspace.activeSpaceDidChangeNotification: // 无userInfo,直接查询需要的空间属性 // 例:获取当前空间展示的窗口列表、空间标识等 // 后续处理空间切换逻辑 default: break } }
- 如果需要兼容多系统版本,建议添加版本判断逻辑,避免苹果后续调整通知结构导致业务异常。
内容的提问来源于stack exchange,提问作者a_kira
相关产品推荐
相关产品推荐

