如何从本地应用程序枚举OS X系统上安装的浏览器。我想建立像choosy,但不同(长篇故事)的东西。但是,我想枚举系统上所有已安装的浏览器。
在Windows上,我可以在默认程序注册表中浏览已安装的浏览器,但是,我不认为在OS X上有类似的概念。我是否必须手动搜索所有捆绑包&他们的info.plist文件?
答案 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