获取macOS默认浏览器名称 - LSCopyDefaultApplicationURLForContentType

时间:2017-06-27 10:31:55

标签: objective-c macos cocoa default nsurl

我正在Xcode中开发一个macOS应用程序。我需要做的一件事就是打开URL系统详细的Web浏览器。我弹出一个警告,为用户提供此选项。警报应显示默认Web浏览器的名称。但是,我无法确定默认Web浏览器的名称。

我尝试了以下代码:

NSLog(@"%@", LSCopyDefaultApplicationURLForContentType(kUTTypeURL, kLSRolesAll, nil));

即使我的默认浏览器设置为Safari,它也会返回file:///Applications/Opera.app/。无论我将默认浏览器更改为(Chrome,Safari,Firefox等),上述方法只返回Opera浏览器的URL。

有谁知道如何找出默认浏览器的名称是什么?我知道如何在默认浏览器中打开URL,这很容易,但是获取默认浏览器的名称不是。

我知道这是可能的,因为像Tweetbot这样的应用程序有一个选项说“在Safari中打开”,它会改变你默认的浏览器。

谢谢你的时间,Dan。

3 个答案:

答案 0 :(得分:2)

您可以使用[[NSWorkspace sharedWorkspace] open:url]在默认浏览器和[[NSWorkspace sharedWorkspace] URLForApplicationToOpenURL: url]中打开任何网址,以获取给定网址的默认应用程序的网址。

要获取应用名称,如果第一个为空,请尝试[[NSBundle bundleWithURL:appUrl] objectForInfoDictionaryKey:@"CFBundleDisplayName"][[NSBundle bundleWithURL:appUrl] objectForInfoDictionaryKey:@"CFBundleName"]。如果两者都失败,[appUrl deletingPathExtension] lastPathComponent]可以作为最后的手段使用。

请参阅此处的文档:

https://developer.apple.com/documentation/appkit/nsworkspace/1533463-openurl?language=objc

https://developer.apple.com/documentation/appkit/nsworkspace/1533391-urlforapplicationtoopenurl?language=objc

https://developer.apple.com/documentation/foundation/nsbundle/1408696-objectforinfodictionarykey?language=objc

答案 1 :(得分:1)

尝试其他LaunchServices方法LSCopyDefaultApplicationURLForURL并传递http方案

CFURLRef httpURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://"), NULL);
NSLog(@"%@", LSCopyDefaultApplicationURLForURL(httpURL, kLSRolesAll, nil));

答案 2 :(得分:0)

在 Swift 5 上使用 accepted answer

var defaultBrowser: String? {
    NSWorkspace.shared.urlForApplication(toOpen: URL(string: "http://")!)
        .flatMap(Bundle.init(url:))
        .flatMap {
            $0.object(forInfoDictionaryKey: "CFBundleDisplayName") ?? $0.object(forInfoDictionaryKey: "CFBundleName")
        }.flatMap {
            $0 as? String
        }
}