如何为所有正在运行的应用程序添加侦听器

Zeu*_*eus 4 macos cocoa for-loop nsrunningapplication swift

我想显示所有正在运行的应用程序名称的列表。

问题:它不会添加调用该函数后正在运行的应用程序。因此,它不会同时将应用程序名称添加到列表中。

目标:我想添加一个侦听器,因此如果一个新应用程序正在运行,它将同时将其添加到数组中,而无需重新启动应用程序或再次调用该函数。

func allRunningApplications() {

        for runningApplication in NSWorkspace.shared.runningApplications {

            let appName = runningApplication.localizedName

            // Add App Name to Array
            array.append(appName)
    }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*nek 6

我提到了“确实启动”等。等,通知,因为您没有解释为什么要监视正在运行的应用程序集。

如果您只对特定应用程序是否已启动(或退出)感兴趣,那么使用通知可能会更容易NSWorkspace

(未经测试的代码)

let center = NSWorkspace.shared.notificationCenter
center.addObserver(forName: NSWorkspace.didLaunchApplicationNotification,
                    object: nil, // always NSWorkspace
                     queue: OperationQueue.main) { (notification: Notification) in
                        if let app = notification.userInfo?[NSWorkspace.applicationUserInfoKey] as? NSRunningApplication {
                            if app.bundleIdentifier == "com.apple.Terminal" {
                                // User just launched the Terminal app; should we be worried?
                            }
                        }
}
Run Code Online (Sandbox Code Playgroud)

请注意,工作区通知发布到 的NSWorkspace私人通知中心,而不是默认通知中心,因此请记住在那里添加您的观察者。


Bus*_*cat 5

您可以轮询 runningApplications 属性(每 x 秒检查一次)来测试是否有新应用程序。但不推荐:https ://developer.apple.com/documentation/appkit/nsworkspace/1534059-runningapplications

\n\n
\n

与 NSRunningApplication 类\xe2\x80\x99s 属性类似,此属性\n 仅当主运行循环以通用模式运行时才会更改。\n 不使用轮询,而是使用键值观察来获取更改通知\n到这个数组属性。

\n
\n\n

因此使用键值观察NSWorkspace.shared.runningApplications

\n\n

一个很好的例子可以在这里找到:https ://www.ralfebert.de/ios-examples/swift/property-key-value-observer/

\n\n

对于您的代码,它应该是这样的:

\n\n
var observers = [NSKeyValueObservation]()\n\noverride func viewDidLoad() {\n    super.viewDidLoad()\n\n    observeModel()\n}\n\nfunc observeModel() {\n    self.observers = [\n        NSWorkspace.shared.observe(\\.NSWorkspace.runningApplications, options: [.initial]) {(model, change) in\n            // runningApplications changed, so update your UI or something else\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

(未经测试的代码)

\n

  • 它可能应该是“NSWorkspace.shared.observe(\.runningApplications, ...)” (2认同)