You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

macOS Swift开发:获取当前应用名称时localizedName为空的替代方案

macOS Swift开发:获取当前应用名称时localizedName为空的替代方案

最近在做macOS菜单栏扩展的时候,我遇到了个棘手的小问题:想获取当前前台应用的名称,一开始写了下面这段代码:

var app: NSRunningApplication = NSWorkspace.shared.frontmostApplication!
var bundleIdentifier: String = app.bundleIdentifier!
var name: String = app.localizedName!
var icon: NSImage? = app.icon

这段代码大多数情况下都能正常工作,但偏偏有些正规应用(比如App Store上架的SQLPro for SQLite)会出现localizedName返回空字符串的情况,可其他属性(比如bundleIdentifier、icon)都没问题。我翻遍了NSRunningApplication的属性,也没找到其他直接能拿到应用名称的字段。

后来在@Sweeper的帮助下,我找到了一个可行的替代方案:通过应用的bundle URL获取对应的Bundle实例,然后从infoDictionary里读取CFBundleName作为兜底,这样就能解决localizedName为空的问题了。代码如下:

let bundle: Bundle = Bundle(url: app.bundleURL!)!
let appName: String = app.localizedName!.isEmpty ? bundle.infoDictionary!["CFBundleName"]! as! String : app.localizedName!

这个思路是先优先用localizedName,如果它为空,就从应用的Info.plist里取CFBundleName——毕竟正规应用的Info.plist里肯定会配置这个字段,这样就能保证我们总能拿到正确的应用名称啦。

备注:内容来源于stack exchange,提问作者Manngo

火山引擎 最新活动