如何将自定义协议映射到Mac上的应用程序?

cli*_*ers 26 macos protocols protocol-handler custom-url-protocol

我正在尝试将自定义协议注册到Mac上的应用程序,即:

  1. 用户点击链接"abcdef:// some/url/here"
  2. 启动已安装的应用程序,并将上面的字符串作为第一个参数传递

我在Windows上使用此问题的信息成功完成了此操作:

如何创建自己的URL协议?(例如:// ...)

我更愿意找到与浏览器无关的东西,换句话说就是在OS级别.我还希望通过shell脚本自动执行此注册,因此希望有一种方法可以执行此操作,而不涉及GUI.

谢谢!

Tur*_*adg 16

在Mac上,AppleScript很容易做到这一点.最详细的描述在本文中,从Mac上的网页链接启动脚本.我读过那个页面,因为它包含一个完整的演练和一个完整的工作示例下载.

基本上,您在脚本中创建一个事件处理程序:

on open location this_URL
    display dialog "I'm doing something with this URL: " & return & this_URL
end open location
Run Code Online (Sandbox Code Playgroud)

然后将其保存为应用程序.然后在Finder中使用Show Package Contents来编辑Info.plist.您可以向应用程序添加一些属性,以将其注册为协议的处理程序.

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Cliff's handler</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>abcdef</string>
        </array>
    </dict>
</array>
Run Code Online (Sandbox Code Playgroud)

  • 操作系统何时实际注册? (4认同)
  • 好的,我也搞定了.正如@counterbeing所说,只有在将应用程序包移动到另一个(任意)位置后,处理程序才能正常工作.这感觉很奇怪,因为好像Mac OS X在移动事件中注册了应用程序的协议处理程序.我可以看到为什么这是有道理的,因为大多数应用程序'安装'到`/ Applications`目录只是让用户在大多数时间将它拖到那里.这样,任何已安装的应用程序(无论是拖入应用程序目录还是由`.mpkg`安装程序移入)都将使其处理程序已注册. (4认同)
  • 这对我来说不适用于10.8.2.我可以使用诸如[更多Internet for Mac](http:// download)之类的方案将该方案与应用程序相关联后,添加[MissingLink](http://www.occupantunknown.com/missinglink/missinglink.html). cnet.com/More-Internet/3000-2094_4-10559064.html).但我无法使用上述简单的AppleScript.如果我运行```open local:test```它会说```/ Users/username/local:/ test不存在```. (2认同)

Jay*_*Jay 14

我没有机会使用它,但前段时间我将OS X URL处理程序加入书签以打开本地文件的链接,这正是您正在寻找的.

链接过程的重要部分是CFBundleURLTypes为应用程序的Info.plist 添加一个适当的部分,描述该方案.给出的示例如下所示:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Local File</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>local</string>
        </array>
    </dict>
</array>
Run Code Online (Sandbox Code Playgroud)

  • 我到处都看到了这个解决方案:但是这个协议处理程序什么时候真正注册?用户是否必须第一次运行该应用程序? (2认同)
  • @iconoclast因为OS X中的大多数应用程序是通过复制安装的,所以`Info.plist`文件在复制时注册(通常是`/ Appplications/Foo`文件夹).在某些情况下,如果mimetypes或URL方案没有自动注册,则可能需要[reboot](http://apple.stackexchange.com/a/51416/147537). (2认同)

Mar*_*son 9

这个问题已经有十年历史了(!)但是谷歌搜索把我带到了这里,所以我想提一下我刚刚发现的东西。

Platypus是一个开源工具,允许您从 shell 脚本或其他脚本语言创建独立的“应用程序”。尽管它实际上只是一个脚本包装器,但它确实启用了一些很酷的东西,例如对话框和菜单栏项。

至关重要的是,它甚至可以让您将“应用程序”注册为您自己的自定义 URL 方案的处理程序。从文档:

注册为 URI 方案处理程序使应用程序注册为 URI 方案的处理程序。这些可以是标准的 URI 方案,例如 http,也可以是您选择的自定义 URI 方案(例如 myscheme://)。如果您的应用程序是 URI 方案的默认处理程序,则每次打开与该方案匹配的 URL 时,它都会启动 open。然后将该 URL 作为参数传递给脚本。

设置非常简单。只需提供您的脚本,在高级设置页面上输入您想要的方案名称,然后单击以构建应用程序(这都是自动化的)。方案和正斜杠之后的所有内容都将作为参数传递给您的脚本。

例如,您可以使用以下 bash 脚本作为“speak://”协议的处理程序。

#!/usr/bin/env bash
# The 'say' command on macOS will speak the provided text through the speaker
say $1
Run Code Online (Sandbox Code Playgroud)

您可以通过进入speak://say-something-funny浏览器或使用open命令行上的命令来调用它:

$ open "speak://hello-from-the-command-line"
Run Code Online (Sandbox Code Playgroud)


Sys*_*ank 6

截至今天,我发现在开销最小的Mac上解决此问题的最佳方法是使用命令行duti,它允许我在一个非常简单的文本文件中定义所有关联:

brew install duti

你需要两件事.要关联的应用的第一个捆绑ID:

mdls -name kMDItemCFBundleIdentifier /Applications/MacVim.app

其次是文件类型的UTI,Apple提供了一个列表,但您也可以通过您的应用程序探索支持的UTI,如下所示:

mdls -name kMDItemContentTypeTree /Applications/MacVim.app

现在在系统中的某个位置创建一个文本文件,将bundle ID与UTI关联:

# ~/.default-apps.duti
#
# bundle id       UTI                  role
com.apple.Safari  public.html          all
org.vim.MacVim    txmt
org.vim.MacVim    public.ruby-script
Run Code Online (Sandbox Code Playgroud)

请注意,我可以关联像txmt这样的URL处理程序以及像Ruby脚本这样的文件类型.

在该文件中,我会跟踪所有应用程序首选项,并在完全全新安装后或在其他正在运行的Mac上获取帐户时立即重现它们:

duti ~/.default-apps.duti
Run Code Online (Sandbox Code Playgroud)


Mat*_*kel 5

Jay的答案中链接页面的重要部分是Info.plist中的条目.

我认为使用Launch Services,如果它是唯一可以处理特定URL方案的应用程序,它将自动打开此应用程序,否则您将需要使用Charlie Martin描述的技巧.

我不确定需要执行的defaults命令是什么,或者它是否是launchctl命令.