代码之家  ›  专栏  ›  技术社区  ›  cliff.meyers

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

  •  26
  • cliff.meyers  · 技术社区  · 16 年前

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

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

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

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

    谢谢

    6 回复  |  直到 8 年前
        1
  •  20
  •   Michael come lately PhiLho    5 年前

    我没有机会使用它,但不久前我把它加入了书签 OS X URL handler to open links to local files

    链接过程的重要部分是添加适当的 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>
    
        2
  •  20
  •   Turadg    14 年前

    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中使用ShowPackageContents编辑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>
    
        3
  •  9
  •   Mark Thomson    6 年前

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

    Platypus

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

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

    #!/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"
    
        4
  •  7
  •   SystematicFrank    10 年前

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

    brew安装duti

    你需要两样东西。要关联的应用程序的第一个捆绑ID:

    mdls-名称kMDItemCFBundleIdentifier/Applications/MacVim.app

    Apple provides a list ,但您也可以通过应用程序探索受支持的UTI,如下所示:

    现在,在系统中的某个位置创建一个文本文件,将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
    
        5
  •  5
  •   Matthew Schinckel    16 年前

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

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

        6
  •  4
  •   Charlie Martin    16 年前

    RCDefaultApp 那会帮你解决的。我仍然很想知道它是如何工作的,我会继续挖掘。

        7
  •  0
  •   Maksym    4 年前

    正在尝试在的帮助下添加我的自定义协议 杜蒂 包装

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

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

    Safari无法打开myapp://因为macOS无法识别以myapp:开头的internet地址。

    另外,当尝试从终端打开时:

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