枚举 OS X 上已安装的浏览器

问题描述 投票:0回答:4

如何从本地应用程序枚举 OS X 系统上已安装的浏览器。我想构建一些像挑剔但不同的东西(长话短说)。但是,我想枚举系统上所有已安装的浏览器。

在 Windows 上,我可以在默认程序注册表中查找已安装的浏览器,但是,我不相信 OS X 上有类似的概念。我是否必须手动搜索所有捆绑包及其 info.plist 文件?

cocoa macos
4个回答
11
投票

使用

LSCopyAllHandlersForURLScheme(CFSTR("http"))
LSCopyAllRoleHandlersForContentType(CFSTR("public.html"), kLSRolesViewer)
,或两者的 交集

这两个函数返回包标识符;您可以使用

LSFindApplicationForInfo
通过应用程序的捆绑标识符在磁盘上查找首选实例。

(不要忘记遵循 Core Foundation 内存管理规则。)

编辑:在对此答案的评论中,smorgan 建议使用

LSCopyAllHandlersForURLScheme(CFSTR("https"))
(即 https)作为第一次调用的替代方法。这是一个很好的建议。


2
投票

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


0
投票

检查此列表

NSArray* apps = (NSArray*)CFBridgingRelease(LSCopyAllHandlersForURLScheme(CFSTR("https"))) ;
NSLog(@"%@", apps);

默认为:

NSString* defaultBundleId = (__bridge NSString*)LSCopyDefaultHandlerForURLScheme(CFSTR("https"));
NSLog(@"default is %@", defaultBundleId);

© www.soinside.com 2019 - 2024. All rights reserved.