我正在尝试在Mac上向应用程序注册自定义协议,即:
- 用户点击带有“abcdef://some/url/here”的链接
- 安装的应用程序启动,并将上述字符串作为第一个参数传递
我已经成功地使用此问题的信息在Windows上完成了这项任务:
我希望找到一些不依赖于浏览器的东西,换句话说,在操作系统层面上。 我还想通过shell脚本自动注册此协议,因此希望有一种无需GUI就能实现的方法。
谢谢!
我正在尝试在Mac上向应用程序注册自定义协议,即:
我已经成功地使用此问题的信息在Windows上完成了这项任务:
我希望找到一些不依赖于浏览器的东西,换句话说,在操作系统层面上。 我还想通过shell脚本自动注册此协议,因此希望有一种无需GUI就能实现的方法。
谢谢!
我之前没有使用过它,但是有一段时间以前我收藏了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>
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>
open local:test
,它会显示/Users/username/local:/test不存在
。 - studgeek/Applications
目录中即可“安装”。这样一来,所有已安装的应用程序(无论是通过拖放到应用程序目录还是通过.mpkg
安装程序移入的)都将注册它们的处理程序。 - fatuhokuabcdef://test
,macOS 是如何调用应用程序的呢?它是一个命令行参数吗?还是其他类型的通信?一旦注册后,我该如何从我的应用程序内部读取这些值? - Aaron Franke这个问题有十年历史(!),但是我通过Google搜索找到了这里,所以我想提一下我刚刚发现的东西。
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"
open -a App scheme://test
来实现,但是简单的形式open scheme://test
无法实现,有没有办法定义(如果可能仅使用命令)给定uri-scheme的默认处理程序? - cglacet你需要两个东西。首先是要关联的应用程序的包标识符(bundle ids):brew install duti
其次是文件类型的UTI,Apple提供了一个列表,但也可以像这样探索应用程序支持的UTI:mdls -name kMDItemCFBundleIdentifier /Applications/MacVim.app
现在,在系统中创建一个文本文件,将包标识符与UTI关联起来即可。mdls -name kMDItemContentTypeTree /Applications/MacVim.app
# ~/.default-apps.duti
#
# bundle id UTI role
com.apple.Safari public.html all
org.vim.MacVim txmt
org.vim.MacVim public.ruby-script
duti ~/.default-apps.duti
Jay回答中链接页面的重要部分是Info.plist中的条目。
我认为使用启动服务,如果只有这个应用程序可以处理特定的URL方案,它将自动打开此应用程序,否则您需要使用Charlie Martin描述的技巧。
我不确定需要执行的默认命令是什么,或者它是否是一个launchctl命令。
我对Mac不是很有经验,所以任何帮助都将不胜感激。
尝试在Packages安装程序的后安装脚本中使用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不识别这种类型的地址。
同时,在尝试从终端打开时也会出现以下问题:
deploy@mini-mac-mini ~ % open myapp://
LSOpenURLsWithRole()针对URL myapp://失败,错误代码为-10810。
Info.plist
文件在复制时会被注册(通常是到/Applications/Foo
文件夹)。在某些情况下,如果MIME类型或URL方案未能自动注册,则可能需要重新启动。 - tresflocal://
注册到应用程序中吗? - Aaron Franke