Shell脚本作为默认浏览器

莱纳斯

假设我有一个名为的可执行文件my_link_opener,如何将其设置为默认浏览器?

我已经尝试了以下方法,但没有成功:


我尝试使用Appify将其包装为.app,然后将生成的.app设置为Safari中的默认浏览器。
但是,由于OS X期望程序只有一个“实例”在其生命周期中打开许多链接,所以这行不通。
而不是在命令行上传递URL,它发送一个-psn_xxxxx参数。

用Automator进行包装
事实证明,如果将其添加为Automator中的工作流,则可以使其以打开的文件作为参数。
但是,这仅适用于文件和文件夹
据我所知,没有办法使URL对Automator工作流有效。

所以,我很不幸。我还能做其他包装魔术吗?

安东尼奥·E。

我找不到任何已经存在的选项(但仍有可能存在),所以我最终写了一个。基本上,它的作用是告诉系统该应用程序浏览器,最终将其自身设置为默认浏览器(请参阅参考资料#define SET_AS_DEFAULT_BROWSER),并在接收到正确的事件时最终通过将url发送到my_link_opener位于应用程序包中的脚本来管理url (即是在.app目录中)。bash命令称为:

nohup /path/to/my_link_opener "_an_url_" >& /dev/null &

#import "ZFTAppDelegate.h"

NSString *runCommand(NSString *commandToRun)
{
    NSTask *task;
    task = [[NSTask alloc] init];
    [task setLaunchPath: @"/bin/sh"];

    NSArray *arguments = @[@"-c" ,[NSString stringWithFormat:@"%@", commandToRun]];
    [task setArguments: arguments];

    NSPipe *pipe;
    pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];

    NSFileHandle *file;
    file = [pipe fileHandleForReading];

    [task launch];

    NSData *data;
    data = [file readDataToEndOfFile];

    NSString *output;
    output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    return output;
}

#define SET_AS_DEFAULT_BROWSER

@implementation ZFTAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSAppleEventManager *em = [NSAppleEventManager sharedAppleEventManager];
    [em setEventHandler:self
            andSelector:@selector(getUrl:withReplyEvent:)
          forEventClass:kInternetEventClass
             andEventID:kAEGetURL];
    [em setEventHandler:self
            andSelector:@selector(getUrl:withReplyEvent:)
          forEventClass:'WWW!'
             andEventID:'OURL'];


#ifdef SET_AS_DEFAULT_BROWSER
    CFStringRef bundleID = (__bridge CFStringRef)[[NSBundle mainBundle] bundleIdentifier];
    LSSetDefaultHandlerForURLScheme(CFSTR("http"), bundleID);
    LSSetDefaultHandlerForURLScheme(CFSTR("https"), bundleID);
#endif


}

- (void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
    NSString *url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
    NSString* scriptPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"my_link_opener"];
    runCommand([NSString stringWithFormat:@"nohup %@ \"%@\" >& /dev/null &", scriptPath, url]);
}

@end

请记住,您应该在应用程序的info.plist中拥有此功能(需要通知操作系统有关您的应用程序处理http / s url的功能):

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>https</string>
        </array>
        <key>CFBundleURLName</key>
        <string>Secure http URL</string>
    </dict>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>http</string>
        </array>
        <key>CFBundleURLName</key>
        <string>http URL</string>
    </dict>
</array>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

浏览器默认字体的CSS

来自分类Dev

更改浏览器解释脚本标签的默认行为

来自分类Dev

更改Web浏览器默认

来自分类Dev

CTRL打开默认浏览器

来自分类Dev

用默认浏览器打开URL?

来自分类Dev

Internet Explorer作为CasperJS的默认浏览器

来自分类Dev

用于在默认外部浏览器中打开URL的Unity3D的小脚本

来自分类Dev

Selenium运行错误的浏览器(默认)

来自分类Dev

覆盖默认的浏览器表单验证

来自分类Dev

如何使用非默认浏览器?

来自分类Dev

如何更改默认浏览器?

来自分类Dev

Inno Setup获取默认浏览器

来自分类Dev

在默认浏览器中运行硒?

来自分类Dev

Chrome Incognito:设为默认浏览器

来自分类Dev

如何更改默认浏览器?

来自分类Dev

Ctrl + Shift + N启动默认浏览器,并将剪贴板上的文本作为url

来自分类Dev

使用Firefox作为默认浏览器,但通过特定程序在Chrome中打开链接

来自分类Dev

如何更改Skype默认浏览器

来自分类Dev

Webview不覆盖默认浏览器

来自分类Dev

Filemaker Web Viewer默认浏览器

来自分类Dev

在浏览器中使用“监视”实时输出Shell脚本?

来自分类Dev

CTRL打开默认浏览器

来自分类Dev

Selenium运行错误的浏览器(默认)

来自分类Dev

MMC中的默认浏览器

来自分类Dev

如何设置默认浏览器?

来自分类Dev

安装的Chrome浏览器将西班牙语作为默认语言

来自分类Dev

将自动浏览器脚本制作为node.js

来自分类Dev

Windows 7默认程序不会让我选择Firefox作为默认浏览器

来自分类Dev

如何选择我的浏览器应用程序作为我的默认浏览器?