Swift中如何获取其他应用的NSDockTile对象?
解答你的Cocoa DockTile问题
首先直接说结论:你没办法把NSRunningApplication转换成NSApplication,也不能通过其他应用的Bundle ID创建对应的NSApplication实例——原因很简单,NSApplication是当前你自己的应用的单例对象,每个应用进程里只会有一个属于它自己的NSApplication,其他应用的NSApplication运行在它们自己的进程空间里,受操作系统进程隔离保护,你的代码根本没法直接访问到。
不过好消息是,你完全没必要这么做!要获取其他运行中应用的DockTile,直接从NSRunningApplication实例里拿就可以了——它本身就有一个dockTile属性:
// 举个例子,获取Safari的DockTile if let safariApp = NSWorkspace.shared.runningApplications.first(where: { $0.bundleIdentifier == "com.apple.Safari" }) { let safariDockTile = safariApp.dockTile // 这里就可以对这个DockTile进行操作了,比如设置自定义内容 safariDockTile.display() // 记得调用display()让更改生效 }
需要提醒你几点:
- 操作其他应用的DockTile可能需要辅助功能权限,如果你的应用没有这个权限,有些操作可能会失效或者被系统阻止。你可以在系统偏好设置的“安全性与隐私”里给你的应用开启权限。
- 不是所有的
NSRunningApplication都有DockTile——比如后台运行的无UI应用,它们可能没有Dock图标,自然也没有DockTile,所以使用前最好先判断safariApp.activationPolicy是不是.regular(常规有UI的应用)。 - 作为Cocoa新手,建议多熟悉
NSWorkspace和NSRunningApplication的相关API,这两个类是管理系统中运行应用的核心工具。
内容的提问来源于stack exchange,提问作者Smitty-Werben-Jager-Manjenson
相关产品推荐
相关产品推荐

