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

Mac Catalyst应用启动时检测按键并执行Core Data清理

解决方案:Mac Catalyst启动阶段检测按键执行Core Data清理

你的需求是可行的,但现有AppDelegate中的pressesBegan方法无法在应用启动、视图完全加载前捕获按键事件——因为此时AppDelegate并非第一响应者,窗口与视图层级尚未完成初始化,按键事件不会传递到这里。

可行实现方案

要在启动早期捕获按键,推荐使用NSEvent事件监视器(Mac Catalyst支持AppKit相关API),在应用启动流程的最早期注册监听,具体步骤如下:

  1. 在AppDelegate中添加事件监视器属性,用于后续移除监听:
private var keyEventMonitor: Any?
  1. 在application(_:didFinishLaunchingWithOptions:)方法中注册本地事件监视器(只监听当前应用的事件,无需额外权限):
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 注册本地按键事件监视器
    keyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in
        // 判断是否为左箭头按键(Mac平台左箭头keyCode固定为123)
        if event.keyCode == 123 {
            self?.clearCoreData()
            // 移除监视器,避免后续正常操作时误触发
            if let monitor = self?.keyEventMonitor {
                NSEvent.removeMonitor(monitor)
                self?.keyEventMonitor = nil
            }
        }
        return event // 返回事件让系统继续处理,也可返回nil截断事件
    }
    
    // 其他启动逻辑...
    return true
}
  1. 可选:在应用退出时移除监视器,避免内存泄漏:
func applicationWillTerminate(_ application: UIApplication) {
    if let monitor = keyEventMonitor {
        NSEvent.removeMonitor(monitor)
        keyEventMonitor = nil
    }
}

关键说明

  • 本地事件监视器(addLocalMonitorForEvents)无需额外系统权限,只会捕获当前应用的按键事件,适合启动阶段的需求。
  • 使用keyCode判断按键更直接,避免启动阶段charactersIgnoringModifiers可能出现的字符编码异常问题。
  • 执行清理后建议立即移除监视器,防止用户后续正常操作时误触发数据清空。

原有代码的补充

如果希望在视图加载完成后也保留按键监听,可继续保留原有pressesBegan方法,配合上述启动阶段的监听,实现全生命周期的按键响应。

内容的提问来源于stack exchange,提问作者jerry seigle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:50:37