38

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

  1. 用户点击带有“abcdef://some/url/here”的链接
  2. 使用上述字符串作为第一个参数传递的已安装应用程序启动

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

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

我更愿意找到与浏览器无关的东西,换句话说,在操作系统级别。我还想通过一个 shell 脚本来自动化这个注册,所以希望有一种不涉及 GUI 的方法来做到这一点。

谢谢!

4

7 回答 7

23

我没有机会使用它,但前段时间我为 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>
于 2009-01-23T02:13:01.063 回答
21

在 Mac 上,使用 AppleScript 很容易做到这一点。最详细的描述在这篇文章中,从 Mac 上的网页链接启动脚本。我会阅读该页面,因为它包含完整的演练和完整的工作示例以供下载。

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

on open location this_URL
    display dialog "I'm doing something with this URL: " & return & this_URL
end open location

然后将其保存为应用程序。然后在 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>
于 2010-09-13T21:02:14.100 回答
10

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

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

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

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

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

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

#!/usr/bin/env bash
# The 'say' command on macOS will speak the provided text through the speaker
say $1

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

$ open "speak://hello-from-the-command-line"
于 2019-01-22T03:08:20.490 回答
7

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

冲泡安装杜蒂

你将需要两件事。您要关联的应用程序的第一个捆绑包 ID:

mdls -name kMDItemCFBundleIdentifier /Applications/MacVim.app

其次是文件类型的 UTI,Apple 提供了一个 list,但您也可以像这样探索您的应用程序支持的 UTI:

mdls -name kMDItemContentTypeTree /Applications/MacVim.app

现在在系统中的某处创建一个文本文件,将捆绑包 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

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

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

duti ~/.default-apps.duti
于 2014-09-02T11:40:43.563 回答
5

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

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

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

于 2009-01-23T02:33:41.007 回答
4

挖掘细节很困难,但是有一个名为RCDefaultApp的首选项窗格会为您处理它。我仍然很想知道它是如何工作的,将继续挖掘。

于 2009-01-23T02:04:19.257 回答
0

我对 Mac 没有太多经验,因此将不胜感激。

尝试在安装程序的安装后脚本中运行duti添加我的自定义协议:

#!/bin/sh
## 
##  add_handlers.sh -- register UTI handlers for the MyApp
##
##  Requires the duti tool
##

./duti -s MyApp myapp

该处理程序出现在 RCDefaultApp 首选项窗格中,但是当从我的其他应用程序调用时,它会在地址栏中使用该协议打开 Safari,询问“您是否要允许此页面打开“MyApp”?单击“允许”时会显示错误:

Safari 无法打开指定地址。 Safari 无法打开“myapp://”,因为 macOS 无法识别以“myapp:”开头的 Internet 地址。

同样在尝试从终端打开时:

deploy@mini-mac-mini ~ % open myapp://

对于 URL myapp://,LSOpenURLsWithRole() 失败,出现错误 -10810。

于 2020-12-26T08:54:50.730 回答