通过命令行设置默认的网络浏览器?

32
我正在尝试通过命令行设置OS X的默认Web浏览器。我发现这篇论坛帖子,但他们正在那里解决的方案是使用特定的应用程序打开特定的URL。我正在寻找一种在整个系统范围内设置默认浏览器的方法。GitHub上有一个很棒的应用程序,名为Objektiv ,它正好符合我的要求,但它是一个应用程序。显然有一种Cocoa方法可以设置NSWorkSpace的默认浏览器。

需要更改偏好文件com.apple.LaunchServices,或许还需要更多操作。

如何通过命令行设置不同的默认浏览器?

感谢您的帮助。


7
我对缺失的功能感到相当沮丧,于是我很快就做了些东西:https://github.com/kerma/defaultbrowser。除了在自己的电脑上测试过之外,我没有真正地对它进行过测试,但它可能对你也有所帮助。 - kerma
谢谢这个小应用程序……它完美地解决了我的类似问题,现在我可以使用Keyboard Maestro切换默认浏览器! - Chris
大致的跨站点重复:http://apple.stackexchange.com/questions/144589/how-can-i-set-the-default-browser-depending-on-time-of-day - tripleee
@kerma 我在 Monterey 上遇到了 defaultbrowser brave 的错误,提示“brave 不可用作 HTTP 处理程序”。 - volvox
忽略那个 - 看起来 brew install defaultbrowser 是正确的方法。如果你想要 Brave 浏览器,使用 defaultbrowser browser - volvox
4个回答

33

我发现了这个工具。安装完成后,你可以做到以下操作:

defaultbrowser chrome

为了防止链接在未来出现404错误,以下是整个源代码。该源代码受2014年Margus Kerma版权下的MIT许可证保护。

#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>

NSString* app_name_from_bundle_id(NSString *app_bundle_id) {
    return [[app_bundle_id componentsSeparatedByString:@"."] lastObject];
}

NSMutableDictionary* get_http_handlers() {
    NSArray *handlers =
      (__bridge NSArray *) LSCopyAllHandlersForURLScheme(
        (__bridge CFStringRef) @"http"
      );

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    for (int i = 0; i < [handlers count]; i++) {
        NSString *handler = [handlers objectAtIndex:i];
        dict[[app_name_from_bundle_id(handler) lowercaseString]] = handler;
    }

    return dict;
}

NSString* get_current_http_handler() {
    NSString *handler =
        (__bridge NSString *) LSCopyDefaultHandlerForURLScheme(
            (__bridge CFStringRef) @"http"
        );

    return app_name_from_bundle_id(handler);
}

void set_default_handler(NSString *url_scheme, NSString *handler) {
    LSSetDefaultHandlerForURLScheme(
        (__bridge CFStringRef) url_scheme,
        (__bridge CFStringRef) handler
    );
}

int main(int argc, const char *argv[]) {
    const char *target = (argc == 1) ? '\0' : argv[1];

    @autoreleasepool {
        // Get all HTTP handlers
        NSMutableDictionary *handlers = get_http_handlers();

        // Get current HTTP handler
        NSString *current_handler_name = get_current_http_handler();

        if (target == '\0') {
            // List all HTTP handlers, marking the current one with a star
            for (NSString *key in handlers) {
                char *mark = [key isEqual:current_handler_name] ? "* " : "  ";
                printf("%s%s\n", mark, [key UTF8String]);
            }
        } else {
            NSString *target_handler_name = [NSString stringWithUTF8String:target];

            if ([target_handler_name isEqual:current_handler_name]) {
              printf("%s is already set as the default HTTP handler\n", target);
            } else {
                NSString *target_handler = handlers[target_handler_name];

                if (target_handler != nil) {
                    // Set new HTTP handler (HTTP and HTTPS separately)
                    set_default_handler(@"http", target_handler);
                    set_default_handler(@"https", target_handler);
                } else {
                    printf("%s is not available as an HTTP handler\n", target);

                    return 1;
                }
            }
        }
    }

    return 0;
}

Makefile:

BIN ?= defaultbrowser
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin

CC = gcc
CFLAGS = -O2

.PHONY: all install uninstall clean

all:
    gcc -o $(BIN) $(CFLAGS) -framework Foundation -framework ApplicationServices src/main.m

install: all
    install -d $(BINDIR)
    install -m 755 $(BIN) $(BINDIR)

uninstall:
    rm -f $(BINDIR)/$(BIN)

clean:
    rm -f $(BIN)

16
现在你也可以通过Homebrew安装它:brew install defaultbrowser - james-see
2
谢谢,这个解决方案非常完美!我的默认浏览器不知何故在偏好设置中被取消了,现在问题已经解决了。 - Calion

10

我知道这并没有直接回答你的问题,但是如果你只需要在Chrome上这么做,它有一个标志可以让你将其设置为默认浏览器:

$ open -a "Google Chrome" --args --make-default-browser

我们能为Opera做到这一点吗? - alper

6

对于新版 macOS(Catalina,Big Sur),我使用 Swift 重新实现了默认浏览器工具(称为 defbro)。主要原因是使用一种“现代”的编程语言,可以让我轻松调整和改进它。我还添加了 json 输出 defbro --json,以便您可以在其中执行其他操作。

安装:brew install jwbargsten/misc/defbro

代码库:https://github.com/jwbargsten/defbro


谢谢,我已经尝试过了,效果和广告中描述的一样!不过你仍然需要确认这个更改,但是你也可以使用AppleScript自动化这个过程:https://www.felixparadis.com/posts/how-to-set-the-default-browser-from-the-command-line-on-a-mac/#automatically-accept-the-prompt-with-applescript - undefined

-11

唯一的方法是在主设置中进行设置:

  1. 从苹果菜单中选择“系统偏好设置”,然后点击“通用”。
  2. 点击“默认网页浏览器”弹出菜单,选择一个网页浏览器,如Chrome。

4
@DanRosenstark所说的是:“命令行 ≠ 图形用户界面(GUI)”。 - Dave Land

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接