You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Electron应用添加到Mac右键分享菜单?

问题:Electron应用添加到Mac右键分享菜单的实现方案

我想把自己开发的Electron应用添加到Mac的右键分享菜单中(点击任意文件夹时触发)。以下是build.config.json文件中的配置片段,我尝试按照ChatGPT的方案重新构建,但觉得该方案不切实际。想请教这是否为正确实现方式?或者有没有其他方法可以将应用添加到分享菜单?求相关参考方案,谢谢!

"mac": {
        "icon": "static/xxx.png", 
        "category": "public.app-category.utilities",
        "target": "dmg",
        "hardenedRuntime": true,
        "gatekeeperAssess": true,
        "extendInfo": {
          "NSAppleEventsUsageDescription": "Let me use Apple Events.",
          "NSCameraUsageDescription": "Let me use the camera.",
          "NSScreenCaptureDescription": "Let me take screenshots.",
          "NSServices": [
          {
            "NSMenuItem": {
              "default": "Share with My App"
            },
            "NSMessage": "shareWithMyApp:",
            "NSSendTypes": [
              "NSStringPboardType"
            ],
            "NSReturnTypes": [
              "NSStringPboardType"
            ]
          }
        ]
        }
      }

现有配置的问题分析

  • 你当前在extendInfo里配置的NSServices是macOS原生服务的标准配置方式,但Electron本身没有原生Objective-C方法绑定能力,NSMessage指定的shareWithMyApp:方法无法直接在Electron进程中响应,这就是该方案不切实际的核心原因。
  • 另外,NSSendTypes仅设置了NSStringPboardType,但你需要处理的是文件夹,必须添加NSFilenamesPboardType(对应文件/文件夹路径数组),否则无法正确接收目标文件夹的信息。

可行实现方案

方案一:自定义协议 + Automator快速操作(零原生开发成本)

  1. 给Electron应用注册自定义协议
    在主进程中添加协议注册和处理逻辑:
app.on('ready', () => {
  if (process.platform === 'darwin') {
    // 注册自定义协议,比如myapp://
    app.setAsDefaultProtocolClient('myapp');
  }
});

// 处理协议唤起事件,解析传递的文件夹路径
app.on('open-url', (event, url) => {
  event.preventDefault();
  // 解析url中的路径参数,格式为myapp://open?path=xxx
  const pathParam = url.split('?path=')[1];
  const targetFolder = decodeURIComponent(pathParam);
  // 这里编写你的文件夹处理逻辑
});
  1. 用Automator创建快速操作
    • 打开Automator,选择「快速操作」类型,设置接收「文件夹」输入
    • 添加「运行Shell脚本」动作,脚本内容:
      open "myapp://open?path=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$@'))")"
      
    • 保存快速操作,命名为「Share with My App」
  2. 完成后右键点击文件夹,就能在「服务」菜单中找到该选项,点击后会直接唤起你的Electron应用并传递目标文件夹路径。

方案二:借助第三方库封装原生服务

使用electron-mac-services库,它封装了macOS原生服务的注册和消息转发逻辑,让Electron能直接响应NSServices事件:

  1. 安装依赖:
npm install electron-mac-services
  1. 在主进程中初始化并处理服务:
const { MacServices } = require('electron-mac-services');

app.on('ready', () => {
  const shareService = new MacServices({
    menuItem: 'Share with My App',
    sendTypes: ['NSFilenamesPboardType'],
    returnTypes: []
  });

  // 监听服务调用事件,接收选中的文件夹路径
  shareService.on('invoke', (data) => {
    const targetFolders = data['NSFilenamesPboardType'];
    // 编写你的文件夹处理逻辑
  });
});
  1. 同时需要在build.config.json的extendInfo.NSServices中调整NSMessage为库指定的内容(具体参考库文档),构建后即可在右键菜单中看到服务选项。

方案三:原生桥接(适合有macOS原生开发经验的场景)

手动修改打包后的Info.plist完善NSServices配置,编写Objective-C桥接代码,通过Electron的原生模块机制将macOS服务的消息转发到Electron进程。这种方式灵活性最高,但需要掌握Objective-C和Electron原生模块开发知识。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:05:30