Electron 客户端开机自启动
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
// 设置自启动
app.setLoginItemSettings({
openAtLogin: true,
openAsHidden: false
})
// 检查状态 - 没有Promise支持
const status = app.getLoginItemSettings()
console.log('是否自启动:', status.openAtLogin)
2. auto-launch
// 创建实例
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 文件
pnpm install auto-launch
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 文件中使用
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 提供了更一致的开发体验:
- 错误处理更清晰:当遇到权限问题时,
auto-launch提供明确的错误信息,而app.setLoginItemSettings可能静默失败 - Windows兼容性更好:Windows系统更新频繁,
auto-launch通过直接操作注册表提供了更稳定的行为 - 跨平台一致性:如果你的应用需要支持Linux,只能选择
auto-launch - 代码组织更清晰:Promise支持让异步操作处理更优雅
五、结论
综合稳定性和易用性考虑,推荐使用 auto-launch,特别是:
- 如果你的应用需要支持Linux
- 如果你重视更好的错误处理和用户反馈
- 如果你的应用在Windows平台有较多用户(Windows更新可能影响原生API)
app.setLoginItemSettings 更适合简单场景,或者你特别关注减少依赖项的情况。但整体而言,auto-launch 提供了更可靠和一致的开发体验。
Electron 客户端开机自启动的更多相关文章
- gj的zabbix客户端开机自启动设置
查看是否自启动 配置chkconfig 启动服务
- electron安装+运行+打包成桌面应用+打包成安装文件+开机自启动
1.初始化node项目,生成package.json文件 npm init 2.安装electron,并保存为开发依赖项 npm install electron -D 3.根目录下新建index.j ...
- electron 写入注册表 实现开机自启动
windows平台 首先先明确:开机自启动写入注册表的位置,在KEY_CURRENT_USER\Software\\Microsoft\\Windows\\CurrentVersion\\Run 打开 ...
- Centos7下配置Redis开机自启动
最近在做作业的时候需要用到Redis缓存,由于每次重启服务器都需要重新启动Redis,也是忒烦人,于是就有了这一篇博客,好,废话不多说. 只有两个步骤: 设置redis.conf中daemonize为 ...
- Ubuntu14.04下安装redis-3.2.0以及开机自启动
去官网下载Redis-3.2.0.tar.gz,将redis-3.2.0.tar.gz放入/opt目录下 解压redis-3.2.0.tar.gz xiaoyao@xiaoyao-virtual-ma ...
- 如何在centos下配置redis开机自启动
2014/11/10补充:其实在redis的下载包中就包含了官方自带的启动脚本,路径在/redis-stable/utils/redis_init_script.在utils目录下也有安装redis- ...
- 【Redis】redis开机自启动、设置守护进程、密码设置、访问权限控制等安全设置(redis默认端口6379)
一.redis设置开机自启动:centOS: 1.修改redis.conf中daemonize为yes,确保守护进程开启,也就是在后台可以运行. (守护进程:孤儿进程:独立于终端而存在的进程,不会因为 ...
- linux svn yum 安装、开机自启动
1.查询是否安装 rpm -qa subversion
- C# WPF开机自启动和只允许一个程序运行
本文出自:https://www.cnblogs.com/2186009311CFF/p/10024949.html 在App.xaml.cs填充一下内容,即可实现只允许一个运行,且不解锁屏幕的情况下 ...
- centos 7 安装Telnet并设为开机自启动、开防火墙端口
[root@b ~]# rpm -qa | grep telnettelnet-0.17-64.el7.x86_64telnet-server-0.17-64.el7.x86_64[root@b ~] ...
随机推荐
- 老奶奶看了都会的WSL2连接USB设备教程!
老奶奶看了都会的WSL2-Ubuntu连接USB设备教程! 作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 参考资料:微软官方文档连接 USB 设备 | Mic ...
- KafKa动态分组ID
背景说明:做这个的原因主要是因为懒,KafKa监听没有独立项目出去,由于KafKa没有组内广播模式,这就造成了一个问题:项目多处启动的时候,就只有一个地方能接收信息.这个时候就要手懂修改分组ID了. ...
- 2025-01-18:施咒的最大总伤害。用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组 power 中,其中可能会有多个咒语具有相同的伤害值。 使用某个特定伤
2025-01-18:施咒的最大总伤害.用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组 power 中,其中可能会有多个咒语具有相同的伤害值. 使用某个特定伤 ...
- NAT、DANT、SNAT的区别
NAT NAT(Network Address Translation,网络地址转换)是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程.在实际应用中,NAT 主要用于实现私有网络访问公共网 ...
- Access pg walkthrough Intermediate window域渗透
namp nmap -p- -A -sS -T4 192.168.200.187 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-23 00 ...
- LeetCode刷题:343. 整数拆分的完全背包写法解析
dp的含义表示:从前i个数中挑选,满足和为j的最大乘积为多少.由于是乘积所以dp初始均为1.i为2开始是因为从1开始挑选,j为2开始应为有效数字是从2开始. 进一步空间优化,应为dp[i][j]只与其 ...
- 注册全局组件(H5) 任意页面使用
在view下创建components文件夹. 在components下创建文件夹base. base文件夹是用来存放 基础组件的. 比如说页面中很多处都在使用的公共组件 如你需要自定义的按钮 在com ...
- Kali 安装谷歌拼音
Kali 安装谷歌拼音 1. 安装 Google 输入法 sudo apt install fcitx-googlepinyin 2. 重新启动系统 reboot 3. 打开开始菜单,搜索fcitx配 ...
- linux mint 安装蓝牙
sudo apt-get install blueman 安装新的 sudo apt-get remove blueberry 卸载旧的
- 动态编译 Java 的神器 Liquor v1.3.10 发布
Liquor 是一个开源的轻量级 Java 动态编译器(零依赖,40KB),它可以在运行时编译 Java 字符串代码片段.类.方法等. 源码地址:https://gitee.com/noear/liq ...