如何从本地应用程序枚举 OS X 系统上已安装的浏览器。我想构建一些像挑剔但不同的东西(长话短说)。但是,我想枚举系统上所有已安装的浏览器。
在 Windows 上,我可以在默认程序注册表中查找已安装的浏览器,但是,我不相信 OS X 上有类似的概念。我是否必须手动搜索所有捆绑包及其 info.plist 文件?
使用
LSCopyAllHandlersForURLScheme(CFSTR("http"))
或 LSCopyAllRoleHandlersForContentType(CFSTR("public.html"), kLSRolesViewer)
,或两者的 集 交集。
这两个函数返回包标识符;您可以使用
LSFindApplicationForInfo
通过应用程序的捆绑标识符在磁盘上查找首选实例。
(不要忘记遵循 Core Foundation 内存管理规则。)
编辑:在对此答案的评论中,smorgan 建议使用
LSCopyAllHandlersForURLScheme(CFSTR("https"))
(即 https)作为第一次调用的替代方法。这是一个很好的建议。
LSCopyAllHandlersForURLScheme 已在 10.15 中弃用
您可以使用 LSCopyApplicationURLsForURL 代替
LSCopyApplicationURLsForURL(URL(string: "https:")! as CFURL, .all)?.takeRetainedValue() as? [URL]
此外,与 LSCopyAllHandlersForURLScheme 不同,LSCopyApplicationURLsForURL 返回应用程序文件路径的 URL。
然后您可以使用
Bundle(url: fileURL)!.bundleIdentifier
提取bundleID
要提取您可以使用的应用程序名称
Bundle(url: fileURL)!.infoDictionary?["CFBundleDisplayName"]
如果
CFBundleDisplayName
返回 nil,则可以使用 CFBundleName
检查此列表
NSArray* apps = (NSArray*)CFBridgingRelease(LSCopyAllHandlersForURLScheme(CFSTR("https"))) ;
NSLog(@"%@", apps);
默认为:
NSString* defaultBundleId = (__bridge NSString*)LSCopyDefaultHandlerForURLScheme(CFSTR("https"));
NSLog(@"default is %@", defaultBundleId);
LSCopyAllHandlersForURLScheme 已在 10.15 中弃用
LSCopyApplicationURLsForURL 已在 12.0 中弃用
从 12.0 开始,使用以下 API 之一:
NWorkspace.shared.urlForApplication(toOpen: URL) -> URL?
NWorkspace.shared.urlsForApplications(toOpen: URL) -> [URL]
NWorkspace.shared.urlForApplication(toOpen: UTType) -> URL?
NWorkspace.shared.urlsForApplications(toOpen: UTType) -> [URL]