Electron 客户端开机自启动

笔记哥 / 03-28 / 25点赞 / 0评论 / 650阅读
# app.setLoginItemSettings 与 auto-launch 对比分析 ## 一、稳定性对比 ### 1. app.setLoginItemSettings - **优点**:作为Electron官方API,有官方维护和支持 - **缺点**: - 在某些Windows版本上存在已知问题 - 部分Windows 10/11更新后可能失效 - 在macOS权限更严格的版本上可能需要额外授权 - 不支持Linux ### 2. auto-launch - **优点**: - 针对各平台做了特殊适配(Windows用注册表,macOS用Launch Services,Linux用.desktop文件) - 对系统权限问题有更好的处理和反馈 - 经过多年实践验证,在各种系统环境下更稳定 - **缺点**: - 依赖第三方库,理论上有维护风险(但该库活跃度良好) ## 二、易用性对比 ### 1. app.setLoginItemSettings ```csharp // 设置自启动 app.setLoginItemSettings({ openAtLogin: true, openAsHidden: false }) // 检查状态 - 没有Promise支持 const status = app.getLoginItemSettings() console.log('是否自启动:', status.openAtLogin) ``` ### 2. auto-launch ```csharp // 创建实例 const autoLauncher = new AutoLaunch({ name: app.getName(), path: app.getPath('exe') }) // 检查状态 - 支持Promise const isEnabled = await autoLauncher.isEnabled() // 启用/禁用 - 链式调用友好 autoLauncher.isEnabled() .then(isEnabled => { if (!isEnabled) return autoLauncher.enable() }) .then(() => console.log('自启动已启用')) .catch(err => console.error('操作失败', err)) ``` ## 三、功能对比 | 功能 | app.setLoginItemSettings | auto-launch | | --- | --- | --- | | Windows支持 | ✅ | ✅ | | macOS支持 | ✅ | ✅ | | Linux支持 | ❌ | ✅ | | Promise支持 | ❌ | ✅ | | 错误处理 | 有限 | 完善 | | 状态检查 | 简单 | 完善 | | 隐藏启动 | ✅ (macOS 已弃用) | ✅ | | 维护状态 | 官方维护 | 社区活跃 | ## 四、实际使用 ### 1. auto-launch.ts 文件 ```csharp pnpm install auto-launch ``` ```csharp import AutoLaunch from 'auto-launch' import { app } from 'electron' import log from 'electron-log/main' /** * 设置应用开机自启动 * @param enable 是否启用自启动,默认为true */ export function setupAutoLaunch(enable: boolean = true): void { const autoLauncher = new AutoLaunch({ name: app.getName(), path: process.execPath, }) if (enable) { autoLauncher.isEnabled() .then((isEnabled) => { if (!isEnabled) { autoLauncher.enable() .then(() => log.info('已启用自启动')) .catch(err => log.error('启用自启动失败:', err)) } else { log.info('自启动已经启用') } }) .catch(err => log.error('检查自启动状态失败:', err)) } else { autoLauncher.isEnabled() .then((isEnabled) => { if (isEnabled) { autoLauncher.disable() .then(() => log.info('已禁用自启动')) .catch(err => log.error('禁用自启动失败:', err)) } else { log.info('自启动已经禁用') } }) .catch(err => log.error('检查自启动状态失败:', err)) } } ``` ### 2. 在 main/index.ts 文件中使用 ```csharp import { setupAutoLaunch } from './utils/auto-launch' async function electronAppInit() { log.info('主进程已启动') // 设置应用自启动 setupAutoLaunch(true) app.on('window-all-closed', () => { if (process.platform !== PLATFORM.DARWIN) { log.info('主进程已关闭') app.quit() } }) } ``` ### 3. 体验 实际开发中,`auto-launch` 提供了更一致的开发体验: 1. **错误处理更清晰**:当遇到权限问题时,`auto-launch` 提供明确的错误信息,而 `app.setLoginItemSettings` 可能静默失败 2. **Windows兼容性更好**:Windows系统更新频繁,`auto-launch` 通过直接操作注册表提供了更稳定的行为 3. **跨平台一致性**:如果你的应用需要支持Linux,只能选择 `auto-launch` 4. **代码组织更清晰**:Promise支持让异步操作处理更优雅 ## 五、结论 综合稳定性和易用性考虑,**推荐使用 auto-launch**,特别是: 1. 如果你的应用需要支持Linux 2. 如果你重视更好的错误处理和用户反馈 3. 如果你的应用在Windows平台有较多用户(Windows更新可能影响原生API) `app.setLoginItemSettings` 更适合简单场景,或者你特别关注减少依赖项的情况。但整体而言,`auto-launch` 提供了更可靠和一致的开发体验。