我正在 Xcode 中开发 macOS 应用程序。我需要做的事情之一是打开系统默认 Web 浏览器的 URL。我弹出一个警报,为用户提供此选项。该警报应该显示默认网络浏览器的名称。但是我无法弄清楚默认网络浏览器的名称。
我尝试过以下代码:
NSLog(@"%@", LSCopyDefaultApplicationURLForContentType(kUTTypeURL, kLSRolesAll, nil));
它只是返回
file:///Applications/Opera.app/
,即使我的默认浏览器设置为 Safari。无论我将默认浏览器更改为什么(Chrome、Safari、Firefox 等),上述方法都只会返回 Opera 浏览器的 URL。
如何找出默认浏览器的名称?我知道如何在默认浏览器中打开 URL,这非常简单,但获取默认浏览器的名称却不是。
我知道这是可能的,因为像 Tweetbot 这样的应用程序有一个选项“在 Safari 中打开”,该选项会更改为您的默认浏览器。
您可以使用
[[NSWorkspace sharedWorkspace] open:url]
在默认浏览器中打开任何 URL,并使用 [[NSWorkspace sharedWorkspace] URLForApplicationToOpenURL: url]
获取给定 URL 的默认应用程序的 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
尝试其他 LaunchServices 方法
LSCopyDefaultApplicationURLForURL
并通过 http
方案
CFURLRef httpURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://"), NULL);
NSLog(@"%@", LSCopyDefaultApplicationURLForURL(httpURL, kLSRolesAll, nil));
在 Swift 5 上使用已接受的答案
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
}
}
//given a fileUrl
CFURLRef helperApplicationURL = LSCopyDefaultApplicationURLForURL((__bridge CFURLRef)fileUrl, kLSRolesAll, NULL);
if (helperApplicationURL != NULL) {
NSString *helperApplicationPath = [(__bridge NSURL *)helperApplicationURL path];
NSString *helperApplicationName = [[NSFileManager defaultManager] displayNameAtPath:helperApplicationPath];
CFRelease(helperApplicationURL);
if ([helperApplicationName containsString:@".app"]) {
helperApplicationName = [helperApplicationName stringByDeletingPathExtension];
}
return helperApplicationName;
}