如何实现从网页一键启动你的 Electron 桌面应用(zxjapp://)

在现代桌面应用开发中,Electron 凭借其跨平台能力和前端友好的特性,受到了越来越多开发者的青睐。但你是否想过,如何让用户从网页上一键启动你本地的 Electron 应用?比如像某些云盘客户端那样,点击网页上的按钮就能直接唤起桌面程序?

本文将手把手教你如何通过自定义协议(URL Scheme)的方式,实现从网页一键唤醒你的 Electron 应用 —— zxjapp://


在这里插入图片描述

我们希望达到的效果是:

  • 在网页中放置一个按钮;
  • 用户点击后尝试打开本地安装的 Electron 应用;
  • 如果未安装,则提示用户下载;
  • 支持 Windows 和 macOS 平台;
  • 可扩展:未来可支持传参、深度链接等功能。

二、实现原理概述

要实现网页调起本地应用,核心在于 注册一个自定义的 URL 协议,例如 zxjapp://,然后让系统知道这个协议应该由我们的 Electron 应用来处理。

Electron 提供了 app.setAsDefaultProtocolClient() 方法,可以让我们轻松地为指定协议设置默认处理程序。


三、具体实现步骤

1. 修改主进程代码(main.js)

首先,在你的 Electron 主进程文件中添加如下代码,用于注册协议和监听请求。

const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');let mainWindow;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js'),contextIsolation: true,enableRemoteModule: false,nodeIntegration: false}});mainWindow.loadFile('index.html');// 打开开发者工具(可选)// mainWindow.webContents.openDevTools();mainWindow.on('closed', () => {mainWindow = null;});
}// 注册 zxjapp:// 协议
if (require('electron-squirrel-startup')) return;const gotTheLock = app.requestSingleInstanceLock();if (!gotTheLock) {app.quit();
} else {app.on('second-instance', (event, commandLine, workingDirectory) => {if (mainWindow) {if (mainWindow.isMinimized()) mainWindow.restore();mainWindow.focus();}});app.whenReady().then(() => {createWindow();// 设置默认协议处理器const protocol = require('electron').protocol;protocol.registerSchemesAsPrivileged([{ scheme: 'zxjapp', privileges: { bypassCSP: true } }]);app.setAsDefaultProtocolClient('zxjapp');app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindow();});});
}app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit();
});

⚠️ 注意:如果你使用的是 electron-builder 打包,确保 package.json 中配置了 appId,否则协议可能无法正确注册。

{"build": {"appId": "com.zxj.app"}
}

2. 处理协议调用(可选增强体验)

为了能在应用被调用时做一些事情,比如显示某个页面或传递参数,我们可以监听 open-url 事件:

app.on('will-finish-launching', () => {app.on('open-url', (event, url) => {event.preventDefault();console.log('收到协议调用:', url);if (mainWindow) {mainWindow.webContents.send('protocol-url', url);}});
});

并在渲染进程中监听这个事件:

const { ipcRenderer } = require('electron');ipcRenderer.on('protocol-url', (event, url) => {alert('收到协议地址: ' + url);// 可以解析并跳转到特定页面
});

3. 网页端添加触发按钮

现在我们在网页中添加一个按钮,点击后尝试打开 zxjapp:// 协议。

// 打开绑卡APP
const openDesktopApp = () => {// 创建一个隐藏的iframe来尝试打开应用const iframe = document.createElement('iframe');iframe.style.display = 'none';document.body.appendChild(iframe);// 设置超时时间const timeout = 2000;const startTime = Date.now();// 尝试打开应用iframe.src = 'runbayun://';// 监听页面可见性变化document.addEventListener('visibilitychange', function handler() {if (document.hidden) {// 如果页面隐藏,说明应用已安装并成功打开document.removeEventListener('visibilitychange', handler);document.body.removeChild(iframe);return;}// 如果超时且页面仍然可见,说明应用未安装if (Date.now() - startTime > timeout) {document.removeEventListener('visibilitychange', handler);document.body.removeChild(iframe);ElMessage.warning('请先安装润吧云桌面应用');}});
};

四、注意事项与常见问题

1. Windows 注册表自动写入

Electron 的 setAsDefaultProtocolClient() 方法会在 Windows 上自动修改注册表项,使 zxjapp:// 关联到你的应用。无需手动编辑注册表。

2. macOS 下需要沙盒权限

如果你的应用启用了沙盒(macOS App Sandbox),你需要在 entitlements.plist 文件中添加如下权限:

<key>com.apple.security.protocol-messaging</key>
<true/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java安全-Servlet内存马

内存马简介 内存马是指将恶意代码注入到内存中&#xff0c;达到无文件落地的效果&#xff0c;使得被攻击方难以察觉。由于是无文件的形式&#xff0c;可以绕过部分基于文件检测的杀软。而 Servlet 内存马是基于 Java Servlet 技术&#xff0c;动态将恶意代码注入到 Tomcat 内存…

LeetCode-前缀和-和为K的子数组

LeetCode-前缀和-和为K的子数组 ✏️ 关于专栏&#xff1a;专栏用于记录 prepare for the coding test。 文章目录 LeetCode-前缀和-和为K的子数组&#x1f4dd; 和为K的子数组&#x1f3af;题目描述&#x1f50d; 输入输出示例&#x1f9e9;题目提示&#x1f9ea;前缀和❓什么…

动态神经网络(Dynamic NN)在边缘设备的算力分配策略:MoE架构实战分析

一、边缘计算场景的算力困境 在NVIDIA Jetson Orin NX&#xff08;64TOPS INT8&#xff09;平台上部署视频分析任务时&#xff0c;开发者面临三重挑战&#xff1a; 动态负载波动 视频流分辨率从480p到4K实时变化&#xff0c;帧率波动范围20-60FPS 能效约束 设备功耗需控制在1…

算法优选系列(9.BFS 解决拓扑排序)

目录 拓扑排序简介&#xff1a; ​编辑 课程表&#xff08;medium&#xff09;&#xff1a; 课程表II&#xff08;medium&#xff09;: 火星词典&#xff08;hard&#xff09;&#xff1a; 拓扑排序简介&#xff1a; 有向无环图&#xff08;DAG图&#xff09; 如上图每条边…

SpringBoot3+Vue3(1)-后端 请求头校验,jwt退出登录,mybaits实现数据库用户校验

1.后端&#xff1a;jwt请求头校验 解析 工具类jwtUtils 解析token 令牌是否过期&#xff0c;验证 正常、异常、运行时错误 倒入工具类是resource 工具类中添加解析用户的方法&#xff1a; 在 在工具类添加id解析 此处调用 添加controller做测试 测试&…

【免杀】C2免杀技术(八)APC注入

本文主要写点自己的理解&#xff0c;如有问题&#xff0c;请诸位指出&#xff01; 概念和流程 “APC注入”&#xff08;APC Injection&#xff09;是免杀与恶意代码注入技术中的一种典型方法&#xff0c;主要用于在目标进程中远程执行代码&#xff0c;常见于后门、远控、植入型…

git工具使用

安装Git 在开始使用Git之前&#xff0c;需要在本地计算机上安装Git工具。Git支持Windows、macOS和Linux系统。可以从Git官方网站下载适合操作系统的安装包&#xff0c;并按照安装向导进行安装。 bash复制插入 # 在Linux上安装Git sudo apt-get install git# 在macOS上安装Git…

SpringBoot微服务编写Dockerfile流程及问题汇总

背景 跟 Docker 磕了两天&#xff0c;将一个包含 N 个微服务的应用部署包改造&#xff0c;使其能够生成 Docker 镜像&#xff0c;并在 Docker 容器中运行。几年前玩过 Docker&#xff0c;隐约记得几个命令「Dockerfile 命令&#xff1a;黑卡饮料、山楂果费、哦SUV&#xff0c;…

pytorch语法学习

启动 python main.py --config llve.yml --path_y test -i output

基于LiveData和ViewModel的路线管理实现(带PopupWindow删除功能)

包含RecyclerView绑定、PopupWindow删除功能和SharedPreferences持久化存储。 1. RouteInfo类(实现Parcelable接口) java 复制 下载 import android.os.Parcel; import android.os.Parcelable;public class RouteInfo implements Parcelable {private Integer routeID;p…

jvm安全点(二)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞

1. 信号处理与桩代码&#xff08;Stub&#xff09;​​ 当线程访问安全点轮询页&#xff08;Polling Page&#xff09;时&#xff1a; ​​触发 SIGSEGV 信号​​&#xff1a;访问只读的轮询页会引发 SIGSEGV 异常。​​信号处理函数​​&#xff1a;pd_hotspot_signal_handl…

如何用数据可视化提升你的决策力?

在数字化浪潮席卷全球的当下&#xff0c;数据已然成为企业和组织发展的核心资产。然而&#xff0c;单纯的数据堆积犹如未经雕琢的璞玉&#xff0c;难以直接为决策提供清晰有力的支持。数据可视化作为一种强大的工具&#xff0c;能够将海量、复杂的数据转化为直观、易懂的图形、…

VoiceFixer语音修复介绍与使用

一.简介 VoiceFixer 是一款基于深度学习的通用语音修复工具&#xff0c;主要用于恢复严重退化的语音信号&#xff0c;支持降噪、消除回声、提升音质等功能。 二.核心功能 1.语音修复与增强 VoiceFixer 采用端到端的神经网络模型&#xff0c;能够处理多种语音退化问题&#x…

Vue百日学习计划Day19-20天详细计划-Gemini版

重要提示&#xff1a; 番茄时钟&#xff1a; 每个番茄钟为25分钟学习&#xff0c;之后休息5分钟。每完成4个番茄钟&#xff0c;进行一次15-30分钟的长休息。动手实践&#xff1a; DevTools 的使用和 Git 命令的掌握都需要大量的实际操作。请务必边学边练。环境准备&#xff1a…

Qt初识.

认识 QLabel 类&#xff0c;能够在界面上显示字符串. 通过 setText 来设置的。参数 QString (Qt 中把 C 里的很多容器类&#xff0c;进行了重新封装。历史原因) 内存泄露 / 文件资源泄露对象树. Qt 中通过对象树&#xff0c;来统一的释放界面的控件对象. Qt 还是推荐使用 new 的…

WebGPU 图形计算

以下是关于 WebGPU 图形计算的基本知识点总结: 一、WebGPU 核心定位与优势 1. 与传统技术对比 维度WebGLWebGPU架构设计OpenGL ES 封装现代图形API抽象(Vulkan/Metal/D3D12)多线程支持单线程渲染多线程并行计算计算能力有限通用计算完整计算管线支持资源控制隐式状态管理显…

视觉基础模型

2.1 视觉的“大模型”时代&#xff1a;ViT的诞生与革新 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;曾是当之无愧的霸主。从LeNet到ResNet&#xff0c;CNN在图像分类、目标检测等任务上取得了巨大成功。然而&#xff0c;随着Transformer模型在自然语…

【React Native】快速入门

对于移动端应用来说&#xff0c;开发 Android 应用使用的语言有 java 和 kotlin&#xff0c;开发 ios 应用使用的语言有 obj-c 和 Swift 。因此&#xff0c;我们使用 react-native 编写一套代码进行跨端开发。 构建项目&#xff1a; npx create-expo-applatest安装 nativewin…

AR 开启昆虫学习新视界,解锁奇妙微观宇宙

在传统昆虫学习中&#xff0c;课堂教学是主要方式&#xff0c;老师通过板书、PPT 传授知识&#xff0c;但学生被动接受&#xff0c;书本静态图片无法展现昆虫真实比例、立体形态&#xff0c;学生难以直观感受复杂身体结构。博物馆的昆虫标本也是学习途径&#xff0c;不过标本放…

BI 大屏是什么意思?具体应用在哪些方面?

目录 一、BI 大屏的定义与内涵 1. 基本概念 2. 核心要素 3. 特点优势 二、如何搭建高效的 BI 大屏 1. 明确需求与目标 2. 选择合适的 BI大屏工具 3. 数据整合与清洗 4. 设计可视化界面 5. 持续优化与更新 三、BI 大屏在企业运营管理中的应用 1. 销售与营销领域 2.…