如何为所有 运行 个应用程序添加监听器

How to add listener for all running applications

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

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

目标:我想添加一个监听器,所以如果一个新的应用程序是 运行 它会同时将它添加到数组中而无需重新启动应用程序或再次调用该功能。

func allRunningApplications() {

        for runningApplication in NSWorkspace.shared.runningApplications {

            let appName = runningApplication.localizedName

            // Add App Name to Array
            array.append(appName)
    }
}

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

Similar to the NSRunningApplication class’s properties, this property will only change when the main run loop is run in a common mode. Instead of polling, use key-value observing to be notified of changes to this array property.

所以使用 key-value 观察 NSWorkspace.shared.runningApplications

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

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

var observers = [NSKeyValueObservation]()

override func viewDidLoad() {
    super.viewDidLoad()

    observeModel()
}

func observeModel() {
    self.observers = [
        NSWorkspace.shared.observe(\.NSWorkspace.runningApplications, options: [.initial]) {(model, change) in
            // runningApplications changed, so update your UI or something else
        }
    ]
}

(未经测试的代码)

我提到了 "did launch",等等。等,通知,因为您没有解释 为什么 您想要监控 运行 应用程序集。

如果您只对特定应用程序是否已启动(或退出)感兴趣,使用 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?
                            }
                        }
}

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

您可以尝试使用NSWorkspace的通知中心

    self.workspace = [NSWorkspace new];
    NSArray *myObserver;
    myObserver = (NSArray*) [[[NSWorkspace sharedWorkspace] notificationCenter] addObserverForName:  NSWorkspaceWillLaunchApplicationNotification object:nil queue:nil usingBlock:^(NSNotification *note)
                         {
                             if(note)
                             {
                               //do your action
                             }
                         }
                        ];

NSWorkspaceWillLaunchApplicationNotification 将在任何应用程序即将启动时通知您。