如何在 OS X 上配置自定义 URL 处理程序?

cwd*_*cwd 82 mac url protocol osx-mountain-lion macos

我在网上阅读了很多关于自定义 URL 处理程序/自定义协议处理程序的文章,例如:

我知道您可以告诉系统某个特定程序能够使用该Info.plist文件处理某个方案/协议:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Local File</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>local</string>
        </array>
    </dict>
</array>
<key>NSUIElement</key>
<true/>
Run Code Online (Sandbox Code Playgroud)

但是,如果有多个应用程序能够打开同一个 URL 处理程序,例如mailto:您如何指定希望系统使用哪一个?

有一些对实用程序的引用,如More Internet preference pane作者的站点似乎不再提供。我确实通过谷歌搜索在网上找到了它,但它似乎有点不稳定 - 就像它是为较旧的 OSX 编写的 - 可能是 Tiger。

我无法找到有关如何为协议和自定义协议设置 URL 处理程序的信息。我假设plist某个地方有一个我可以编辑的文件 - 或者也许有一个更新、更好的实用程序可以很好地与 Mountain Lion 配合使用?

slh*_*hck 74

您要查找的文件是~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist.

它包含一个名为 的数组LSHandlers,并且LSHandlerURLScheme可以使用 相应地修改定义 的字典子项LSHandlerRole

除了手动编辑此文件,您还可以使用RCDefaultApp,它为您提供了一个不错的首选项窗格。据说它不适用于 macOS 10.12 及更高版本,但我可以确认它在 macOS 10.14 下运行。

另一种选择是SwiftDefaultApps

例如,这里是 SVN 和 SSH:

……在 RCDefaultApp 中:

  • 4分19秒?严重地? (40认同)
  • 感谢您快速而详细的回答。看起来挺好的!问题虽然 - 我认为我之前尝试过 RCDefaultApp 并且遇到了一些问题。它是否一直在为您无缝工作? (2认同)
  • @nute 只是从我的头顶,不确定。也许是用 Automator 创建的应用程序包装了一个 shell 脚本? (2认同)
  • 首选项窗格 [SwiftDefaultApps](https://github.com/Lord-Kamina/SwiftDefaultApps) 在 macOS 10.15.7 Catalina 上为我成功工作。我打开首选项窗格,选择“URI 方案”,向下滚动到“tel”协议处理程序,并将其从 Skype.app 更改为 FaceTime.app(Apple 的本机解决方案)。从那时起,在 Safari 中选择一个电话号码,然后右键单击以打开上下文菜单,显示“使用 iPhone 呼叫 XXX”,然后再次使用本机呼叫处理而不是 Skype。 (2认同)

Qui*_*ant 19

2017 年 7 月更新:RCDefaultApplstool不再适用于 macOS 10.12 或更高版本。我们必须找到一个新的解决方案。

编辑 2018 年 3 月
我找到了SwiftDefaultApps,但无法测试,因为我还没有使用 High Sierra。


进一步上一个答案,如果您想在命令行上执行此操作,您可以使用该lstool命令,它是 RCDefaultApp 的核心,位于RCDefaultApp.prefPane/Contents/Resources/lstool.

它的用法很简单:

[~]$lstool --help
Usage:

lstool read [<lsscheme> [<type>]]
lstool [-n] write <lsscheme> <type> <app>
lstool [-n] setoption <lsscheme> <type> login|ignorecreator YES|NO
lstool [-n] register {<app>}
lstool [-n] unregister {<path> | <app>}
lstool apps

-n means do not make changes
<lsscheme> is one of: internet, media, url, extension, uti, mime, ostype
<app> is the path to an application or a name to be looked up
Run Code Online (Sandbox Code Playgroud)

  • 我是 SwiftDefaultApps 的开发人员,SWDA 从一开始就使用 macOS Sierra 和更高版本进行编码(实际上,我在阅读此问题和类似问题后非常沮丧后开始研究它)。它在 10.13 中无法正常工作,主要是由于 Swift 或 macOS 本身的错误,但它似乎已在 10.13.4/Swift 4.1 的更新中得到修复。 (3认同)
  • 我在 https://github.com/Lord-Kamina/SwiftDefaultApps 找到了 RCDefaultApp 的可能替代品,尽管您必须使用 Xcode 自己构建它。 (2认同)

小智 17

列出 Apple OS X 10.10 (Yosemite) 上的当前 LaunchServices URL 处理程序设置:

defaults read com.apple.LaunchServices/com.apple.launchservices.secure
Run Code Online (Sandbox Code Playgroud)


小智 6

使用 XCode 打开文件非常简单。

使用https://discussions.apple.com/thread/5815759plutil的答案中所述的内置命令在格式 xml1 或 binary1 之间进行转换的工作方式类似。

plutil -convert xml1 /file-i-wish

nano /file-i-wish & save file 

plutil -convert binary1 /file-i-wish
Run Code Online (Sandbox Code Playgroud)

不需要“外星人”工具:-)


小智 5

如果有人感兴趣,我实际上编写了一个简化自定义 URL 协议注册的应用程序。它被称为 LinCastor ( http://onflapp.wordpress.com/lincastor/ )。处理程序可以定义为 AppleScript 或 shell 脚本(可以是 perl、python 或其他任何东西)。