You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux环境构建Mac OS应用:自定义右键菜单方案咨询

无需Cocoa框架自定义Mac App右键/Dock菜单的方法

完全可以做到!macOS本身提供了纯配置+脚本的原生支持,不需要依赖Xcode、Swift或Cocoa框架,非常适配你这种手动构建.app包的场景。下面是几个经过验证的可行方案:


方案1:通过Info.plist + AppleScript配置应用专属右键菜单

这是最直接的方式,利用系统对AppleScript的原生支持,通过修改Info.plist注册自定义菜单条目,关联你的Shell脚本逻辑。

操作步骤:

  1. .app/Contents目录下创建Scripts文件夹,放入一个AppleScript脚本(比如CustomMenuHandler.scpt),脚本里处理菜单点击后的动作,用相对路径确保能找到你的入口Shell脚本:

    on handleCustomMenu()
        -- 用相对路径定位到App内的Shell脚本
        set scriptPath to (path to me as string) & "../Resources/your-entry-script.sh"
        do shell script quoted form of scriptPath
    end handleCustomMenu()
    
  2. 修改.app/Contents/Info.plist(XML格式),添加以下配置:

    <!-- 启用AppleScript支持 -->
    <key>NSAppleScriptEnabled</key>
    <true/>
    <!-- 注册自定义菜单命令 -->
    <key>NSUserScriptSuiteName</key>
    <string>YourAppCustomSuite</string>
    <key>NSUserScriptCommandDefinitions</key>
    <array>
        <dict>
            <key>CommandClass</key>
            <string>NSAppleScriptCommand</string>
            <key>CommandName</key>
            <string>customMenuAction</string>
            <key>ScriptFile</key>
            <string>Scripts/CustomMenuHandler.scpt</string>
            <key>MenuItem</key>
            <dict>
                <key>default</key>
                <string>我的自定义动作</string>
            </dict>
        </dict>
    </array>
    
  3. 保存修改后,执行命令让系统刷新配置:

    killall Dock; killall Finder
    

    之后右键点击你的App(无论是在Dock还是Finder里),就能看到自定义菜单了。


方案2:利用系统Services框架添加全局右键菜单

如果需要更灵活的全局触发(比如在选中任意App时都能看到你的自定义选项),可以通过配置Services实现,同样无需Cocoa。

操作步骤:

  1. Info.plist中添加NSServices数组配置,示例如下:

    <key>NSServices</key>
    <array>
        <dict>
            <!-- 菜单显示名称 -->
            <key>NSMenuItem</key>
            <dict>
                <key>default</key>
                <string>对该App执行自定义操作</string>
            </dict>
            <!-- 直接关联Shell脚本 -->
            <key>NSSendAppleScript</key>
            <string>do shell script "/path/to/your/app/Contents/Resources/your-script.sh" &amp;</string>
            <!-- 指定服务适用上下文:针对应用程序 -->
            <key>NSRequiredContext</key>
            <dict>
                <key>NSServiceCategory</key>
                <string>Application</string>
            </dict>
            <!-- 服务唯一标识 -->
            <key>NSPortName</key>
            <string>com.yourcompany.yourapp</string>
        </dict>
    </array>
    

    注意把路径替换成你App内脚本的实际相对或绝对路径。

  2. 同样执行killall Dock; killall Finder刷新配置,之后在Finder里右键点击你的App,就能在「服务」子菜单里找到你的自定义选项。


方案3:动态添加菜单(AppleScript后台运行)

如果需要根据App状态动态调整菜单内容,可以在入口Shell脚本里启动一个后台AppleScript,让它实时添加/修改菜单条目。

操作步骤:

  1. 编写AppleScript脚本(比如DynamicMenu.scpt),放在.app/Contents/Resources目录下:

    tell application "System Events"
        -- 定位到你的应用进程
        set appProcess to first application process whose name is "YourAppName"
        -- 获取应用主菜单
        set appMainMenu to menu bar 1 of appProcess
        set appMenu to menu bar item 1 of appMainMenu's menu
        
        -- 添加自定义菜单项
        make new menu item at end of appMenu with properties {name:"动态菜单1", action:"runScript1:"}
        make new menu item at end of appMenu with properties {name:"动态菜单2", action:"runScript2:"}
    end tell
    
    -- 菜单点击对应的Shell脚本调用
    on runScript1:sender
        set scriptPath to (path to me as string) & "../Resources/script1.sh"
        do shell script quoted form of scriptPath
    end runScript1:
    
    on runScript2:sender
        set scriptPath to (path to me as string) & "../Resources/script2.sh"
        do shell script quoted form of scriptPath
    end runScript2:
    
  2. 在你的入口Shell脚本里添加后台启动命令:

    osascript "$(dirname "$0")/Resources/DynamicMenu.scpt" &
    
  3. 第一次运行时,系统会提示给App授予「辅助功能」权限,授权后菜单就能正常显示并工作了。


关键注意事项:

  • 所有脚本路径尽量使用相对路径,比如"$PWD/Contents/Resources/script.sh",避免因App运行时工作目录变化导致脚本找不到。
  • 如果App被系统标记为未签名,可执行xattr -cr /path/to/your.app移除扩展属性,确保脚本正常运行。
  • 每次修改Info.plist后,都需要重启Dock和Finder才能让配置生效。

内容的提问来源于stack exchange,提问作者ffConundrums

火山引擎 最新活动