2

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

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

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

func allRunningApplications() {

        for runningApplication in NSWorkspace.shared.runningApplications {

            let appName = runningApplication.localizedName

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

3 回答 3

5

我提到了“确实发射”等。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的私人通知中心,而不是默认通知中心,因此请记住在此处添加您的观察者。

于 2018-03-06T06:04:53.760 回答
3

您可以轮询 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
        }
    ]
}

(未经测试的代码)

于 2018-03-03T15:54:27.640 回答
2

您可以尝试使用 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 会通知您。

于 2018-07-03T05:21:23.603 回答