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命令手动注册扩展:
这种方式系统会直接识别Swift应用为扩展的宿主,原本的App Group通信逻辑可以直接复用。# 注册扩展 pluginkit -a /Applications/MyElectronApp.app/Contents/MacOS/mySwiftApp.app/Contents/PlugIns/myFinderExtension.appex # 启用扩展 pluginkit -e use -i <你的扩展Bundle ID>
方案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通信逻辑。
- 如果你不想修改Electron的沙箱配置(当前
3. 后续验证排查
- 每次打包后执行
pluginkit -mvvv查询已注册的FinderSync扩展,确认只有1个你需要的实例处于运行状态,无重复冗余实例 - 切换Finder扩展偏好设置的开关时,查看Console日志确认扩展启动时绑定的宿主进程PID符合你的预期
- 若调整后徽章/菜单仍不显示,检查扩展代码中
directoryURLs配置是否包含你需要监控的目录路径,未加入监控的目录不会触发扩展的回调逻辑。
注:开发阶段仅用开发者证书签名、不使用provisioning profile的配置是可行的,只有发布到App Store时才需要匹配对应的provisioning profile。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

