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

时间:2009-05-31 04:30:22

标签: cocoa macos

如何从本地应用程序枚举OS X系统上安装的浏览器。我想建立像choosy,但不同(长篇故事)的东西。但是,我想枚举系统上所有已安装的浏览器。

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

3 个答案:

答案 0 :(得分:9)

使用LSCopyAllHandlersForURLScheme(CFSTR("http"))LSCopyAllRoleHandlersForContentType(CFSTR("public.html"), kLSRolesViewer)或两者的set intersection

这两个函数返回包标识符;您可以使用LSFindApplicationForInfo通过其包标识符在应用程序的磁盘上查找首选实例。

(不要忘记关注the Core Foundation memory-management rules。)

编辑:在对此答案的评论中,smorgan建议LSCopyAllHandlersForURLScheme(CFSTR("https"))(即http s )作为第一次调用的替代方案。这是一个很好的建议。

答案 1 :(得分:0)

选中此列表

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

这是默认值:

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

答案 2 :(得分:0)

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