English 中文(简体)
如何在Mac上将自定义协议映射到应用程序?
原标题:
  • 时间:2009-01-23 01:49:55
  •  标签:

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

  1. User clicks on link with "abcdef://some/url/here"
  2. An installed application is launched with the above string passed as the first param

我已经成功地在Windows系统上完成了这个操作,使用了这个问题中提供的信息。

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

我更喜欢找到一些独立于浏览器的东西,换句话说,在操作系统层面上。我也希望通过一个shell脚本自动化这个注册过程,因此希望有一种方法可以不涉及图形用户界面来完成它。

谢谢!

最佳回答

我还没有使用它的机会,但是我一段时间前收藏了用于打开本地文件链接的OS X URL处理程序,这正是你要找的。

链接过程的重要部分是向您应用程序的 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>
问题回答

在Mac上使用AppleScript很容易实现。最详细的说明在这篇文章里,在Mac上从网页链接启动脚本。我建议阅读该页面,因为它包括一个完整的引导和一个可以下载的完整工作示例。

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

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

然后将其保存为应用程序。然后在Finder中使用“显示包内容”来编辑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>

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

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"

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

安装duti,请使用brew命令。

你需要两样东西。首先是你想要关联的应用程序的Bundle ID:

mdls -name kMDItemCFBundleIdentifier /Applications/MacVim.app: mdls -名称kMDItemCFBundleIdentifier /应用程序/MacVim.app

第二个文件类型的UTI,Apple提供了一个列表,但你也可以像这样探索你的应用所支持的UTI:

mdls -name kMDItemContentTypeTree /Applications/MacVim.app mdls -名称 kMDItemContentTypeTree /Applications/MacVim.app

现在在您的系统的某处创建一个文本文件,将bundle ids与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

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

我认为通过启动服务,如果这是唯一一个能够处理特定URL方案的应用程序,它将自动打开该应用程序,否则您需要使用Charlie Martin描述的技巧。

我不确定需要执行哪个defaults命令,或者它是否是一个launchctl命令。

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

我对Mac不是很有经验,所以任何帮助都将不胜感激。

试图使用 dutiPackages 安装程序的 post-install 脚本中添加我的自定义协议:

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

./duti -s MyApp myapp

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

Safari can’t open the specified address. Safari can’t open “myapp://” because macOS doesn’t recognise internet addresses starting with “myapp:”.

同样,在尝试通过终端打开时:

部署@mini-mac-mini ~%打开myapp://

LSOpenURLsWithRole()使用myapp://的URL时发生了错误-10810。





相关问题
热门标签