Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何将自定义协议映射到Mac上的应用程序?_Macos_Protocols_Protocol Handler_Custom Url Protocol - Fatal编程技术网

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

Macos 如何将自定义协议映射到Mac上的应用程序?,macos,protocols,protocol-handler,custom-url-protocol,Macos,Protocols,Protocol Handler,Custom Url Protocol,我正在尝试向Mac上的应用程序注册自定义协议,即: 用户单击“链接”abcdef://some/url/here" 启动已安装的应用程序时,将上述字符串作为第一个参数传递 我已使用此问题中的信息在Windows上成功完成此操作: 我更愿意找到与浏览器无关的东西,换句话说,在操作系统级别。我还想通过一个shell脚本自动完成注册,所以希望有一种不涉及GUI的方法来完成注册 谢谢 挖掘细节很困难,但有一个名为“首选项”的窗格将为您处理它。我仍然很想知道它是如何工作的,我会继续挖掘。我还没有机会使用

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

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

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


    谢谢

    挖掘细节很困难,但有一个名为“首选项”的窗格将为您处理它。我仍然很想知道它是如何工作的,我会继续挖掘。

    我还没有机会使用它,但不久前我把它加入了书签,这正是你想要的


    链接过程的重要部分是在应用程序的Info.plist中添加一个描述方案的适当的。此处给出的示例如下所示:

    CbundleUrlTypes
    CFBundleURLName
    本地文件
    循环流化床锅炉方案
    地方的
    
    Jay答案中链接页面的重要部分是Info.plist中的条目

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


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

    在Mac上,使用AppleScript很容易做到这一点。最详细的描述在本文中。我读过那个页面,因为它包括一个完整的演练和一个完整的工作示例供下载

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

    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>
    
    CbundleUrlTypes
    CFBundleURLName
    克利夫的处理者
    循环流化床锅炉方案
    abcdef
    
    到今天为止,我发现在Mac电脑上以最小开销解决此问题的最佳方法是使用命令行,它允许我在一个非常简单的文本文件中定义我的所有关联:

    brew安装duti

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

    mdls-名称kMDItemCFBundleIdentifier/Applications/MacVim.app

    其次是文件类型的UTI,但您也可以通过以下方式探索应用程序支持的UTI:

    mdls-名称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
    

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

    是一个开源工具,允许您从shell脚本或其他脚本语言创建独立的“应用程序”。虽然它实际上只是一个脚本包装器,但它确实支持一些很酷的东西,比如对话框和菜单栏项

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

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

    设置非常简单。只需提供您的脚本,在“高级设置”页面上输入所需的方案名称,然后单击以构建应用程序(它是全自动的)。scheme和前斜杠之后的所有内容都将作为参数传递给脚本

    例如,您可以使用以下bash脚本作为“speak://”协议的处理程序

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>Cliff's handler</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>abcdef</string>
            </array>
        </dict>
    </array>
    
    #/usr/bin/env bash
    #macOS上的“say”命令将通过扬声器说出提供的文本
    比如说1美元
    
    您可以通过输入
    speak://say-something-funny
    进入浏览器,或使用命令行上的
    打开
    命令:

    $open”speak://hello-from-the-command-line"
    
    我对Mac电脑没有太多经验,因此如果有任何帮助,我将不胜感激

    试图在软件包安装程序的安装后脚本中运行的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无法识别以“myapp:”开头的互联网地址

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

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


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

    这在10.8.2上对我不起作用。我可以在使用类似的方式将方案与应用程序关联后添加using。但我无法使用上述简单的AppleScript。如果我运行
    open local:test
    它会说
    /Users/username/local:/test不存在。
    。好的,t他的建议很好。我似乎很管用。我遇到了和山姆一模一样的人