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

时间:2009-01-23 01:49:55

标签: macos protocols protocol-handler custom-url-protocol

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

  1. 用户点击链接“abcdef:// some / url / here”
  2. 启动已安装的应用程序,并将上述字符串作为第一个参数传递
  3. 我使用此问题中的信息在Windows上成功完成了此操作:

    how do I create my own URL protocol? (e.g. so://...)

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

    谢谢!

7 个答案:

答案 0 :(得分:16)

在Mac上,使用AppleScript很容易。最详细的描述在本文Launch Scripts from Webpage Links on 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>

答案 1 :(得分:14)

我没有机会使用它,但不久前我给OS X URL handler to open links to local files加了书签,这正是你要找的。

链接过程的重要部分是在应用程序的Info.plist中添加适当的CFBundleURLTypes,描述该方案。给出的例子看起来像这样:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Local File</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>local</string>
        </array>
    </dict>
</array>

答案 2 :(得分:6)

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

  

brew install duti

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

  

mdls -name kMDItemCFBundleIdentifier /Applications/MacVim.app

第二个文件类型的UTI Apple provides a list,但你也可以通过你的应用程序探索支持的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

请注意,我可以将URL处理程序(如txmt)与文件类型(如Ruby脚本)相关联。

在该文件中,我会跟踪所有应用偏好设置,并在完全全新安装后或在其他正在运行的Mac上获取帐户时立即重现:

duti ~/.default-apps.duti

答案 3 :(得分:5)

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

我认为启动服务会自动打开这个应用程序,如果它是唯一可以处理特定URL方案的应用程序,否则你需要使用Charlie Martin描述的技巧。

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

答案 4 :(得分:4)

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

答案 5 :(得分:0)

这个问题已有十年历史了(!),但是Google搜索将我带到了这里,所以我想提一下我刚刚发现的内容。

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

重要的是,它甚至使您可以将“ app”注册为自己的自定义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

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

$ open "speak://hello-from-the-command-line"

答案 6 :(得分:0)

我对 Mac 的使用经验不多,因此不胜感激。

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

#!/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:”开头的互联网地址。

尝试从终端打开时:

deploy@mini-mac-mini ~ % 打开 myapp://

LSOpenURLsWithRole() 失败,URL myapp:// 的错误为 -10810。