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

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

我正在 Xcode 中开发 macOS 应用程序。我需要做的事情之一是打开系统默认 Web 浏览器的 URL。我弹出一个警报,为用户提供此选项。该警报应该显示默认网络浏览器的名称。但是我无法弄清楚默认网络浏览器的名称。

我尝试过以下代码:

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

它只是返回

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

如何找出默认浏览器的名称?我知道如何在默认浏览器中打开 URL,这非常简单,但获取默认浏览器的名称却不是。

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

objective-c macos cocoa default nsurl
4个回答
5
投票

您可以使用

[[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

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

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


2
投票

尝试其他 LaunchServices 方法

LSCopyDefaultApplicationURLForURL
并通过
http
方案

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

1
投票

在 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 } }
    

0
投票
//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; }
    
© www.soinside.com 2019 - 2024. All rights reserved.