如何从命令行在 macos 上配置自定义方案处理程序

问题描述 投票:0回答:1

我正在尝试在 macOS 上配置自定义方案处理程序从命令行为其他 mac 用户提出可重现的过程。


我愿意接受任何替代方式,但这里有一个对我有用的等效手动程序:

  1. 打开“脚本编辑器”应用程序
  2. 粘贴以下代码:
on open location this_URL
   tell application "Terminal"
      activate
      do script "/tmp/my-custom-handler.sh '" & this_URL & "' ; exit"
   end tell
end open location
  1. 文件 > 使用
    Save as: my-custom-handler
    Format: Application
  2. 保存

这将创建一个已可用的工作

my-custom-handler.app

open -a my-custom-handler.app my-custom-handler://anexample?of=uri&with=parameter

我们必须注意到,该应用程序有一个

my-custom-handler.app/Contents/Info.plist
文件,其中
CFBundleIdentifier
设置为
com.apple.ScriptEditor.id.my-custom-handler

  1. 现在最后一步是将所需的方案与该应用程序标识符相关联,以避免必须为
    -a
    命令指定
    open
    参数并让它自动使用正确的应用程序本身。

可以使用以下命令:

plutil -insert "LSHandlers.0" -json '{"LSHandlerPreferredVersions":{"LSHandlerRoleAll":"-"},"LSHandlerRoleAll":"com.apple.ScriptEditor.id.my-custom-handler","LSHandlerURLScheme":"my-custom-handler"}' ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist

注意它需要应用程序标识符ID

现在使用简单的以下命令即可完美运行:

open my-custom-handler://anexample?of=uri&with=parameter

好吧,现在很酷,我想要一种自动/命令行方式来执行相同的操作。 正如你所看到的,我已经使用

plutil
获得了方案关联部分。 所以我错过的是相当于从命令行将应用程序保存为
Script Editor
的操作。
这是我测试的内容,其中

Application

是一个纯文本文件,其中包含在上面的手动过程中粘贴到脚本编辑器的程序:

my-custom-handler.applescript

它有效,我可以再次使用:

osacompile -o my-custom-handler.app my-custom-handler.applescript

请注意,第一次运行时会请求许可,如下所示:

但是它工作正常,这里的问题是从

open -a my-custom-handler.app my-custom-handler://anexample?of=uri&with=parameter

命令创建的应用程序没有

osacompile
,所以基本上不可能像以前一样使用
CFBundleIdentifier
设置与我们的自定义方案的关联...
好吧,没什么大不了的,我只需编辑新应用程序的 

plutil

文件,使用像

Info.plist
这样的命令来附加即可轻松实现自动化:
sed

现在我可以使用此标识符来使用命令关联我的方案:

<key>CFBundleIdentifier</key> <string>org.toto.my-custom-handler</string>

但是......遗憾的是,一旦我编辑应用程序的
plutil -insert "LSHandlers.0" -json '{"LSHandlerPreferredVersions":{"LSHandlerRoleAll":"-"},"LSHandlerRoleAll":"org.toto.my-custom-handler","LSHandlerURLScheme":"my-custom-handler"}' ~/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist

,它就不再在运行时工作,我看到它尝试打开应用程序,但什么也没发生。

所以短期内:

我有一种使用
    Info.plist
  • 自动创建应用程序的方法,但它没有配置方案关联所需的标识符。
    我有一种自动化方案关联的方法,但它需要一个配置了正确标识符的应用程序
  • 我无法通过脚本编辑器或
  • osacompile
  • 创建应用程序后对其进行编辑,因为它会破坏应用程序
    
    
  • 我确信我对 Info.pdlist 的编辑在技术上是正确的,但我认为应用程序上的任何更改都涉及安全隐患,这会使应用程序“损坏”。事实上,该应用程序可能仍然有效,但它不会要求用户确认在“系统设置”>“隐私”中添加权限。

所以我现在陷入困境,以下之一可以解决这个问题:

告诉
    osacompile
  • 附加标识符(我在手册中没有看到此功能..)
    找到一种方法来编辑现有应用程序而不破坏它(可能是出于安全考虑)
  • 将方案与没有标识符的应用程序相关联(我认为这是不可能的)
  • 抱歉描述太长,但这是我的全部知识,我承认昨天之前我从未使用过macos,所以也许我没有走正确的路,任何建议都可以接受,谢谢。

编辑:我使用的是 MacO,大确定。

EDIT2:如果我们忘记“方案”部分并简化苹果脚本以删除事件部分,例如:

osacompile

我也有类似的行为:

它会一直工作,直到我不编辑 .app 中的任何内容为止
  • 当我编辑 .app 时(例如添加包标识符),它不再起作用
  • 但是这一次,在执行时我得到了错误,而不是沉默“无”:

无权将 Apple 事件发送到系统事件

所以我对防止编辑应用程序文件的安全保护的猜测似乎至少部分正确。希望它可以帮助一些Macos专家:)

macos security automation handler
1个回答
0
投票

    在应用程序的
  • tell application "Terminal" activate do script "/tmp/my-custom-handler.sh '" & this_URL & "' ; exit" end tell

    中指示它可以处理

    Info.plist
    方案:
    my-custom-scheme

  • 更新 LaunchServices 数据库中已编译脚本的应用程序条目
  • plutil -insert CFBundleURLTypes -json '[{"CFBundleURLName":"my-custom-scheme URL","CFBundleURLSchemes":["my-custom-scheme"]}]' my-custom-handler.app/Contents/Info.plist

    
    
  • 对于不唯一的 URL 方案名称(例如,处理
/System/Library/Frameworks/CoreServices.framework/Versions/Current/Frameworks/LaunchServices.framework/Versions/Current/Support/lsregister my-custom-handler.app

URL),您可能还需要在

file:
下注册(从而遇到需要更新包 ID 的原始障碍)。不过,我似乎没有遇到任何代码签名问题。请参阅下面的完整脚本:
LSHandlers

© www.soinside.com 2019 - 2024. All rights reserved.