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

electron-builder嵌入Finder Sync扩展后Finder不显示徽章与菜单问题

解决步骤

1. 清理重复扩展实例

你当前的报错plug-ins must be sandboxed是因为内置在Swift应用里的.appex重复实例导致的,直接在打包阶段过滤掉这部分冗余文件即可:

  • 要么编译Swift应用时不要将FinderSync扩展内置打包到其Contents/PlugIns目录
  • 要么在electron-builder的extraFiles配置中,复制mySwiftApp.app时添加过滤规则,排除内部的PlugIns/*.appex文件,从根源消除内层实例的报错。

2. 修正扩展宿主绑定逻辑

你当前遇到的菜单/徽章不显示、LSExceptions shared instance invalidated for timeout报错,核心原因是扩展的实际宿主和预期宿主不匹配:
你把扩展放在Electron应用的顶层PlugIns目录下,系统会默认将Electron主应用识别为扩展的宿主,但你的扩展预期是和Swift应用通信,扩展启动后找不到对应的应答进程就会触发超时。
这里提供两种可选方案:

方案A:保留Swift应用作为扩展宿主
  • 删掉electron-builder配置中mac.extraFiles里复制.appex到顶层PlugIns的规则,只保留Swift应用的复制逻辑
  • 在Electron主应用启动完成、拉起Swift子进程后,执行shell命令手动注册扩展:
    # 注册扩展
    pluginkit -a /Applications/MyElectronApp.app/Contents/MacOS/mySwiftApp.app/Contents/PlugIns/myFinderExtension.appex
    # 启用扩展
    pluginkit -e use -i <你的扩展Bundle ID>
    
    这种方式系统会直接识别Swift应用为扩展的宿主,原本的App Group通信逻辑可以直接复用。
方案B:直接用Electron作为扩展宿主

砍掉中间的Swift应用层,让扩展直接和Electron主应用通信,简化架构:

  • 保证扩展的Bundle ID前缀和Electron的appId(com.myapp.mac)完全一致
  • 调整通信方案:
    • 如果你不想修改Electron的沙箱配置(当前app-sandbox为false),放弃App Group通信,改用Unix套接字、分布式通知等跨进程方式实现Electron和扩展的信息交互
    • 如果你可以接受给Electron开启沙箱,修改entitlements把com.apple.security.app-sandbox设为true,同时添加你用到的App Group权限配置,即可沿用原有App Group通信逻辑。

3. 后续验证排查

  1. 每次打包后执行pluginkit -mvvv查询已注册的FinderSync扩展,确认只有1个你需要的实例处于运行状态,无重复冗余实例
  2. 切换Finder扩展偏好设置的开关时,查看Console日志确认扩展启动时绑定的宿主进程PID符合你的预期
  3. 若调整后徽章/菜单仍不显示,检查扩展代码中directoryURLs配置是否包含你需要监控的目录路径,未加入监控的目录不会触发扩展的回调逻辑。

注:开发阶段仅用开发者证书签名、不使用provisioning profile的配置是可行的,只有发布到App Store时才需要匹配对应的provisioning profile。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:54:05