Как добавить слушатель для всех запущенных приложений
Я хочу отобразить список всех запущенных имен приложений.
Проблема: не добавляется приложение, которое запускается после вызова функции. Следовательно, он не добавляет имя приложения в список одновременно.
Цель: я хочу добавить прослушиватель, поэтому, если новое приложение запущено, оно добавит его в массив одновременно, без перезапуска приложения или повторного вызова функции.
func allRunningApplications() {
for runningApplication in NSWorkspace.shared.runningApplications {
let appName = runningApplication.localizedName
// Add App Name to Array
array.append(appName)
}
}
3 ответа
Я упомянул "сделал запуск", эт. al., уведомления, потому что вы не объяснили, почему вы хотели отслеживать набор запущенных приложений.
Если вас интересует только то, запущено ли конкретное приложение (или оно вышло), возможно, будет проще использовать 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
Это частный центр уведомлений, а не центр уведомлений по умолчанию, поэтому не забудьте добавить туда своих наблюдателей.
Вы можете опрашивать свойство runningApplications (проверять его каждые x секунд), чтобы проверить, есть ли новое приложение. Но это не рекомендуется: https://developer.apple.com/documentation/appkit/nsworkspace/1534059-runningapplications
Подобно свойствам класса NSRunningApplication, это свойство будет изменяться только тогда, когда основной цикл выполнения выполняется в обычном режиме. Вместо опроса используйте наблюдение значения ключа, чтобы получать уведомления об изменениях этого свойства массива.
Так что используйте наблюдение значения ключа на 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
}
]
}
(непроверенный код)
Вы можете попробовать использовать центр уведомлений 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 уведомит вас, если какое-либо приложение будет запущено.