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




