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

Electron JS macOS生产构建IPC通信异常求助

macOS生产构建版本Electron IPC数据无法获取的问题

问题代码

electron.js

ipcMain.on('getConnectionsList', () => {
  window.webContents.send('connectionsList', conns_data)
})

preload.js

getConnectionsList: (_init) => {
  ipcRenderer.send('getConnectionsList', _init)
},
connectionsList: (list) => {
  ipcRenderer.on('connectionsList', list)
},

App.js (React)

React.useEffect(() => {
  window.multisig.getConnectionsList(false)
  window.multisig.connectionsList((_event, list) => {
    setItemData(list)
  })
}, [])

运行现状

  • 开发环境全平台运行正常
  • Windows、Linux生产构建版本运行正常
  • macOS开发环境运行正常
  • macOS生产构建版本无法获取预期数据

排查与解决方案

1. 验证conns_data在macOS生产环境的有效性

macOS生产构建可能因文件路径、资源打包或权限问题,导致conns_data未正确初始化。可在主进程回调中添加日志排查:

ipcMain.on('getConnectionsList', () => {
  // 写入临时文件记录数据状态
  require('fs').writeFileSync('/tmp/conn_debug.log', JSON.stringify(conns_data, null, 2));
  window.webContents.send('connectionsList', conns_data)
})

构建后运行应用,查看/tmp/conn_debug.log确认数据是否存在。

2. 调整IPC监听与请求的时序

React组件中可能存在“先发送请求、后注册监听”的时序问题,导致主进程发送的消息丢失。调整代码顺序:

React.useEffect(() => {
  const handleList = (_event, list) => setItemData(list);
  // 先注册监听
  window.multisig.connectionsList(handleList);
  // 再发送请求
  window.multisig.getConnectionsList(false);

  // 组件卸载时移除监听,避免内存泄漏
  return () => {
    // 需要在preload中补充移除监听的方法
    window.multisig.removeConnectionsList(handleList);
  };
}, [])

对应的preload.js补充方法:

// 原有方法...
removeConnectionsList: (cb) => {
  ipcRenderer.removeListener('connectionsList', cb)
},

3. 检查macOS打包配置

  • 确认conns_data依赖的本地文件已被打包进应用(如使用electron-builder,检查package.json的files配置是否包含相关文件)
  • 若涉及网络或本地文件访问,需在打包配置中启用对应权限(如electron-builder的mac.permissions添加network或filesystem权限)

4. 改用invoke/handle实现可靠双向通信

Electron的ipcRenderer.invoke+ipcMain.handle是更稳定的双向通信模式,避免时序问题:

electron.js修改

ipcMain.handle('getConnectionsList', async () => {
  return conns_data;
})

preload.js修改

getConnectionsList: async (_init) => {
  return ipcRenderer.invoke('getConnectionsList', _init);
},

App.js修改

React.useEffect(() => {
  const fetchData = async () => {
    try {
      const list = await window.multisig.getConnectionsList(false);
      setItemData(list);
    } catch (err) {
      console.error('获取连接列表失败:', err);
    }
  };
  fetchData();
}, [])

5. 确认代码签名与系统权限

macOS生产构建需完成苹果开发者账号签名,未签名或签名不完整的应用可能被系统限制IPC通信。同时检查应用是否申请了必要的系统权限(如网络访问权限)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:52:24