我正在尝试将自定义协议注册到Mac上的应用程序,即:
用户点击链接"abcdef:// some/url/here"
启动已安装的应用程序,并将上面的字符串作为第一个参数传递
我在Windows上使用此问题的信息成功完成了此操作:
如何创建自己的URL协议?(例如:// ...)
我更愿意找到与浏览器无关的东西,换句话说就是在OS级别.我还希望通过shell脚本自动执行此注册,因此希望有一种方法可以执行此操作,而不涉及GUI.
谢谢!
在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.您可以向应用程序添加一些属性,以将其注册为协议的处理程序.
CFBundleURLTypes CFBundleURLName Cliff's handler CFBundleURLSchemes abcdef
我没有机会使用它,但前段时间我将OS X URL处理程序加入书签以打开本地文件的链接,这正是您正在寻找的.
链接过程的重要部分是CFBundleURLTypes
为应用程序的Info.plist 添加一个适当的部分,描述该方案.给出的示例如下所示:
CFBundleURLTypes CFBundleURLName Local File CFBundleURLSchemes local
截至今天,我发现在开销最小的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
请注意,我可以关联像txmt这样的URL处理程序以及像Ruby脚本这样的文件类型.
在该文件中,我会跟踪所有应用程序首选项,并在完全全新安装后或在其他正在运行的Mac上获取帐户时立即重现它们:
duti ~/.default-apps.duti
Jay的答案中链接页面的重要部分是Info.plist中的条目.
我认为使用Launch Services,如果它是唯一可以处理特定URL方案的应用程序,它将自动打开此应用程序,否则您将需要使用Charlie Martin描述的技巧.
我不确定需要执行的defaults命令是什么,或者它是否是launchctl命令.