当前位置: 首页 > news >正文

electron设置默认应用程序

electron默认应用程序设置

electron设置默认应用程序在electron中是一个较为常见的功能,但如何才能正确设置默认应用程序,今天我们通过一个electron制作的浏览器应用来一探究竟。

平台差异

macOS 平台

macOS 使用基于 LaunchServices 的机制来管理默认应用程序。当应用请求成为默认浏览器时,系统会弹出确认对话框让用户选择。

mac设置默认应用程序相对较为简单,因为mac的应用程序只要在Application中进行安装后,系统会自动注册这个应用程序,注册后,通过设置,设置某些权限之类的,在应用列表中都能直接找得到这个应用程序。而需要设置为默认应用程序,这是第一步。

第二步需要的是让你的应用程序设置为某些特定协议的处理程序(即:默认应用程序),比如设置为默认浏览器时,浏览器主要是处理http,https这类协议的。故,需要设置为http,https的默认应用处理程序

Windows 平台

Windows 使用注册表来管理默认应用程序设置。从 Windows 10 开始,系统更加严格控制默认应用程序的设置,通常需要用户手动在系统设置中确认。

windows默认不会为安装的应用注册应用程序,故,当你去设置默认应用程序时,你会发现让你选择的应用列表中,并没有你的应用程序。
此时,需要我们自行在安装应用时,去处理好应用的注册,协议的处理等等。而最终,用户去设置为默认应用时,仅仅是选择我们的应用而已。

macos设置方式

前面我们已经说过了,mac默认程序安装就会注册这个应用,故我们只需要在用户点击设置为默认应用时,去将我们的应用注册为相关协议的处理程序即可,而这一步操作,electron已经为我们提前准备好了相关的api----setAsDefaultProtocolClient

await Promise.all([app.setAsDefaultProtocolClient('http'),app.setAsDefaultProtocolClient('https'),app.setAsDefaultProtocolClient('file')
]);

值得注意的是,macos上,electron在调用setAsDefaultProtocolClient去注册协议处理时。通过系统会弹出授权对话框,要求用户确认是否允许应用注册为特定协议的处理程序,但是,electron却没有提供可以监听用户允许或者拒绝的回调。此时我们可以另辟蹊径,通过isDefaultProtocolClient定时查看http或者https协议是否已经正确设置,如果已经设置,说明已经允许,并成功设置了默认应用程序

完整代码如下:

await Promise.all([app.setAsDefaultProtocolClient('http'),app.setAsDefaultProtocolClient('https'),app.setAsDefaultProtocolClient('file')
]);const waitForUserChoice = new Promise<boolean>((resolve) => {let attempts = 0;const maxAttempts = 30;const checkInterval = setInterval(() => {attempts++;const currentStatus = app.isDefaultProtocolClient('http') && app.isDefaultProtocolClient('https');if (currentStatus || attempts >= maxAttempts) {clearInterval(checkInterval);resolve(currentStatus);}}, 1000);
});// 等待用户选择结果
const userChoice = await waitForUserChoice;return !!userChoice

windows设置方式

windows在点击设置为默认浏览器时,本质其实只是打开windows的默认程序处理面板,剩下的就需要用户自行操作去选择哪个应用设置为默认应用,故它的设置只需要设置协议关联,并打开默认程序设置面板即可

try {const exePath = process.execPath; // 获取当前应用程序的exe路径const appName = app.getName();const appId = `${appName.replace(/\s+/g, '')}`; // 去掉空格app.setAppUserModelId(appId); // 设置正确的AppUserModelID// 1. 设置协议关联await Promise.all([app.setAsDefaultProtocolClient('http', exePath, [`--app-id=${appId}`]),app.setAsDefaultProtocolClient('https', exePath, [`--app-id=${appId}`]),app.setAsDefaultProtocolClient('.html', exePath, [`--app-id=${appId}`]),app.setAsDefaultProtocolClient('.htm', exePath, [`--app-id=${appId}`]),app.setAsDefaultProtocolClient('file', exePath, [`--app-id=${appId}`]),app.setAsDefaultProtocolClient('file', exePath, [`--app-id=${appId}`])]);shell.openExternal('ms-settings:defaultapps');return true;
} catch (error) {console.error('设置失败:', error);return false;
}

需要注意的是,windows此时打开默认程序应用面板时,你会发现,在你想要选择自己的应用时,列表中是没有你自己的应用的。这是因为你的应用安装后,在windows注册表中其实是没有被注册的,所以会找不到。此时需要我们在安装应用时去windows注册表中注册我们的应用

windows注册表注册应用

定义一个.nsh文件,文件中定义两个NSIS宏,customInstall和customUnInstall,分别会在应用被安装时和应用被卸载时调用。

customInstall

!macro customInstall; 注册应用能力// 注册表中注册应用名称,名称为PRODUCT_NAME,这是一个变量WriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\Capabilities" "ApplicationName" "${PRODUCT_NAME}"// 注册表中注册应用描述信息WriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\Capabilities" "ApplicationDescription" "${PRODUCT_NAME} Browser"// 注册表中注册默认打开时的执行命令// %1 表示传入的 URL 或文件路径// "$INSTDIR\${APP_EXECUTABLE_FILENAME}" 表示安装目录下的可执行文件,$INSTDIR是一个内置变量,获取安装目录,APP_EXECUTABLE_FILENAME是可执行文件名,如xxx.exeWriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\shell\open\command" "" '"$INSTDIR\${APP_EXECUTABLE_FILENAME}" "%1"'// 同上,表示新开窗口打开时,执行的命令WriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\shell\new-window\command" "" '"$INSTDIR\${APP_EXECUTABLE_FILENAME}" "--new-window" /f'; 注册协议处理WriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\Capabilities\URLAssociations" "http" "${PRODUCT_NAME}URL"WriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\Capabilities\URLAssociations" "https" "${PRODUCT_NAME}URL"; 注册文件类型WriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\Capabilities\FileAssociations" ".html" "${PRODUCT_NAME}HTML"WriteRegStr HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\Capabilities\FileAssociations" ".htm" "${PRODUCT_NAME}HTML"; 注册到Windows默认程序列表,让用户选择默认应用程序时,可以选到我们的应用WriteRegStr HKLM "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}" "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}\Capabilities"; 注册协议处理命令WriteRegStr HKLM "SOFTWARE\Classes\${PRODUCT_NAME}URL" "" "URL:${PRODUCT_NAME} Protocol"WriteRegStr HKLM "SOFTWARE\Classes\${PRODUCT_NAME}URL" "URL Protocol" ""WriteRegStr HKLM "SOFTWARE\Classes\${PRODUCT_NAME}URL\shell\open\command" "" '"$INSTDIR\${APP_EXECUTABLE_FILENAME}" "%1"'; 注册文件类型处理命令WriteRegStr HKLM "SOFTWARE\Classes\${PRODUCT_NAME}HTML" "" "${PRODUCT_NAME} HTML Document"WriteRegStr HKLM "SOFTWARE\Classes\${PRODUCT_NAME}HTML\shell\open\command" "" '"$INSTDIR\${APP_EXECUTABLE_FILENAME}" "%1"'
!macroend!macro customUnInstall; 卸载时清理注册表,清理所有安装时创建的注册表项,确保卸载后系统中不留下无效的注册表项DeleteRegKey HKLM "SOFTWARE\Clients\StartMenuInternet\${PRODUCT_NAME}"DeleteRegKey HKLM "SOFTWARE\Classes\${PRODUCT_NAME}URL"DeleteRegKey HKLM "SOFTWARE\Classes\${PRODUCT_NAME}HTML"DeleteRegValue HKLM "SOFTWARE\RegisteredApplications" "${PRODUCT_NAME}"
!macroend
工作流程

1、应用注册:
应用在 RegisteredApplications 中注册自己
声明自己的能力(Capabilities)
2、用户选择:
用户在"设置 > 应用 > 默认应用"中看到已注册的应用
选择某个应用作为默认浏览器
3、系统处理:
当用户点击链接或打开 HTML 文件时
Windows 查找对应的协议/文件类型处理器
执行相应的 shell 命令

关键概念

Capabilities:应用能力声明,告诉系统该应用支持什么
URLAssociations:协议关联,如 http、https、ftp 等
FileAssociations:文件类型关联,如 .html、.htm、.pdf 等
Shell Commands:实际执行的命令行指令

此时,这些都做完后,我们便可以在mac或者windows系统中,点击设置为默认应用按钮时,设置我们的应用程序为默认应用了。设置完成后,当我们点击打开某些文件或者链接时(以浏览器为例,当我们点击一个链接时,默认打开这个链接时,系统会使用我们自己的浏览器去打开这个链接),系统会自动唤起打开我们的应用。

此时,对大部分应用而言,我们的工作已经结束了,但如果时浏览器这种处理链接的应用的话,当我们打开了我们的应用后,可以还需要做一些事情。

  • 当我们是mac系统时,我们需要通过监听open-url事件来获取到需要打开的链接地址,然后再做对应的操作,比如调用createTab等
  • 当我们是windows系统时,我们需要通过监听second-instance事件,获取需要打开的链接地址,然后再做对应的操作,比如调用createTab等
app.on('open-url', (event, urlStr) => {event.preventDefault();handleProtocolUrl(urlStr); // 处理URL的函数
});app.on('second-instance', (event, commandLine) => {if (process.platform === 'win32') {const url = commandLine.find(arg => arg.startsWith(`${PROTOCOL}:`));if (url) handleProtocolUrl(url);}
});

结尾

至此,默认浏览器设置已经完成

http://www.dtcms.com/a/398546.html

相关文章:

  • Flink 初体验10 分钟完成下载、安装、本地集群启动与示例作业运行
  • toLua[二] Examples 01_HelloWorld分析
  • asp源码打开网站网站页面数量
  • 安卓手机termux安装ubuntu被kill进程解决
  • java后端工程师进修ing(研一版‖day48)
  • 目标检测进化史
  • 北京做养生SPA的网站建设高端网站建设 来磐石网络
  • 网站建设有哪三部来年做那些网站能致富
  • 外贸公司网站素材产品营销文案
  • VSCode C/C++ 开发环境配置
  • FPGA自学笔记--VIVADO RAM IP核控制和使用
  • 电源——设计DCDC原理图与参数选型
  • 企业网站建设策划书 前言263云通信官方网站
  • pip config list输出为空?如何配置pip镜像源?不同方式配置有什么区别?
  • 表格工具怎么选,国产化替代方案测评(2025 全维度实测版)
  • 分布式 ID 生成方案实战指南:从选型到落地的全场景避坑手册(二)
  • 企业网站建设案例宝安三网合一网站建设
  • 做透水砖的网站vs2019可以做网站吗
  • 鸿蒙后台定时任务实战
  • 【win32】ffmpeg 解码器2
  • MCU知识体系
  • 【win32】ffmpeg 解码器
  • 东莞市官网网站建设公司中企动力z邮箱登录入口
  • wordpress网站seo罗夫曼三大社区模式
  • 搭建一个属于自己的mac摄像头视频流rtsp服务
  • Spring Boot 集成 RabbitMQ 实现可靠消息传递:从配置到实战
  • Linux学习记录--多线程共享变量
  • 网站格式有哪些内容私人建设手机网站
  • 【Java后端】SpringBoot 常用工具类和工具方法汇总
  • leetcode hot100 中等难度 day03-刷题