CI: - 拆分为 x64 和 arm64 两个独立构建步骤 - x64: 签名但不公证(-c.mac.notarize=false),timeout 15min - arm64: 签名 + 按版本号条件公证(vX.Y.0 公证,vX.Y.Z 只签名),timeout 35min - 先跑 x64,stash 产物后跑 arm64,确保 latest-mac.yml 来自 arm64 Electron: - electron/main.ts: darwin+x64 跳过 initAutoUpdater - electron/preload.ts: darwin+x64 不暴露 updater bridge - 前端 AppShell 已有运行时检测(!!window.electronAPI?.updater), x64 自动 fallback 到 browser 模式更新检查 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
46 lines
1.9 KiB
TypeScript
46 lines
1.9 KiB
TypeScript
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
const { contextBridge, ipcRenderer } = require('electron');
|
|
|
|
contextBridge.exposeInMainWorld('electronAPI', {
|
|
versions: {
|
|
electron: process.versions.electron,
|
|
node: process.versions.node,
|
|
chrome: process.versions.chrome,
|
|
},
|
|
shell: {
|
|
openPath: (folderPath: string) => ipcRenderer.invoke('shell:open-path', folderPath),
|
|
},
|
|
dialog: {
|
|
openFolder: (options?: { defaultPath?: string; title?: string }) =>
|
|
ipcRenderer.invoke('dialog:open-folder', options),
|
|
},
|
|
install: {
|
|
checkPrerequisites: () => ipcRenderer.invoke('install:check-prerequisites'),
|
|
start: (options?: { includeNode?: boolean }) => ipcRenderer.invoke('install:start', options),
|
|
cancel: () => ipcRenderer.invoke('install:cancel'),
|
|
getLogs: () => ipcRenderer.invoke('install:get-logs'),
|
|
onProgress: (callback: (data: unknown) => void) => {
|
|
const listener = (_event: unknown, data: unknown) => callback(data);
|
|
ipcRenderer.on('install:progress', listener);
|
|
return () => { ipcRenderer.removeListener('install:progress', listener); };
|
|
},
|
|
},
|
|
bridge: {
|
|
isActive: () => ipcRenderer.invoke('bridge:is-active'),
|
|
},
|
|
// Native updater: disabled on macOS x64 (Intel) — those users get browser-mode
|
|
// update check (download link to GitHub Releases) instead.
|
|
...(process.platform === 'darwin' && process.arch === 'x64' ? {} : {
|
|
updater: {
|
|
checkForUpdates: () => ipcRenderer.invoke('updater:check'),
|
|
downloadUpdate: () => ipcRenderer.invoke('updater:download'),
|
|
quitAndInstall: () => ipcRenderer.invoke('updater:quit-and-install'),
|
|
onStatus: (callback: (data: unknown) => void) => {
|
|
const listener = (_event: unknown, data: unknown) => callback(data);
|
|
ipcRenderer.on('updater:status', listener);
|
|
return () => { ipcRenderer.removeListener('updater:status', listener); };
|
|
},
|
|
},
|
|
}),
|
|
});
|