Electron网页调起客户端

Electron网页调起客户端(伪协议)

相信你们平时使用浏览器时遇到过点击一个连接或者按钮,浏览器会询问是否打开客户端,移动端和桌面端都有这种状况。好比百度网盘,在网页上点击连接时会拉起百度网盘的客户端进行下载,实际上这些功能都是经过注册伪协议来实现的,本篇主要介绍如何经过伪协议调起Electron客户端,并获取伪协议传过来的参数。vue

实现目标

  1. 为Electron添加一个伪协议(URL Scheme 协议)。
  2. 在浏览器网页上添加一个伪协议的点击。拉起应用。

Mac的URL Scheme

Mac上每一个应用包中都有一个info.plist文件,这个通常用做于一些访问权限的配置及软件的信息,ios开发的同窗可能比较熟悉,注册URL Scheme其实是在这个文件中添加对应的key,value。咱们能够查看一些软件的URL Schemenode

  1. 访达中找到桌面软件,好比vscode。
  2. 右键显示包内容。
  3. 进入Contents文件夹。
    info.plist
  4. 找到info.plist,直接点击查看或者用vscode打开,这个CFBundleURLName就是协议名,CFBundleURLSchemes为协议内容
    info.plist
    info.plist
  5. 浏览器输入对应的URL Schemevscode://file/${filePath},filePath为文件的pwd路径,看是否vscode能打开对应文档。

Windows的URL Scheme

Windows上是经过在注册表中添加URL Protocol来实现伪协议的,其实说简单点也是添加key,value值。同上,咱们查看一下vscode:webpack

  1. win+r输入regedit肯定。
  2. 找到HKEY_CLASSES_ROOT\vscode,很差找的能够Ctrl+F勾选数据进行搜索'URL:vscode',能够找到两处HKEY_CURRENT_USER\Software\Classes\vscode,固然这两处值都是同样的。
    URL:vscode
    vscode shell
  3. 咱们能够右键vscode目录将其导出成一个reg文件,能够看到关键处在两点,一个URL:vscode,还有一个是vscode的启动路径。
    也就是说检测到vscode://会执行下面的exe命令,%1是唤起软件的伪协议,浏览器打开vscode://file/${filePath}试试,好比个人vscode://file/F:/work/electron/vue-cli-electron/README.md,看是否vscode能打开对应文档ios

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\vscode]
    "URL Protocol"=""
    @="URL:vscode"
    
    [HKEY_CLASSES_ROOT\vscode\shell]
    
    [HKEY_CLASSES_ROOT\vscode\shell\open]
    
    [HKEY_CLASSES_ROOT\vscode\shell\open\command]
    @="\"E:\\Microsoft VS Code\\Code.exe\" --open-url -- \"%1\""

实现URL Scheme

这里介绍一下Electron上实现伪协议的两种方式:git

  1. 经过setAsDefaultProtocolClient注册协议

这个要讲的很少,看文档的东西连接,在主进程直接写上就能够:github

import { app } from 'electron'

if (!app.isDefaultProtocolClient('vue-cli-electron')) {
  app.setAsDefaultProtocolClient('vue-cli-electron')
}

打包后安装软件,打开软件,尝试在浏览器中打开vue-cli-electron://,看是否有唤起提示。web

优势:简单,快捷。
缺点:首先这个是在主进程中执行的,也就是说首次安装软件后必须打开软件后才会写入对应的URL Scheme,软件卸载时Mac的info.plist在包内,一块儿删除了,但Windows是写入注册表的,并不会被主动清理,卸载软件后再打开伪协议仍是会有打开软件的提示。vue-cli

  1. electron-builder + nsis

使用electron-builder进行配置在能够打包(安装)时就写入伪协议,而且能够在卸载的拓展宏里进行注册表的清理,使用此方式的话,方案1的注册能够除去掉。shell

  • Mac配置:在vue.config.js中的builderOptions添加electron-builder的配置连接api

    protocols: [{
    name: 'vue-cli-electron',
    schemes: ['vue-cli-electron']
    }],

    这里要注意的是文档展现有点问题,fileAssociations和protocols是属于同级的,并非fileAssociations里面的。这样咱们就完成了Mac系统伪协议的配置。

  • Windows配置:在项目根目录新建installer.nsh,一样的在builderOptions的nsis中添加include: "installer.nsh"

    !macro customInstall
      DeleteRegKey HKCR "vue-cli-electron"
      WriteRegStr HKCR "vue-cli-electron" "" "URL:vue-cli-electron"
      WriteRegStr HKCR "vue-cli-electron" "URL Protocol" ""
      WriteRegStr HKCR "vue-cli-electron\shell" "" ""
      WriteRegStr HKCR "vue-cli-electron\shell\Open" "" ""
      WriteRegStr HKCR "vue-cli-electron\shell\Open\command" "" "$INSTDIR\${APP_EXECUTABLE_FILENAME} %1"
    !macroend
    
    !macro customUnInstall
      DeleteRegKey HKCR "vue-cli-electron"
    !macroend

    这里简单介绍一下,customInstall是electron-builder提供的NSIS拓展宏,看名字这个是安装时执行的,同理customUnInstall是卸载执行,其余状况参考连接
    DeleteRegKey是删除注册表
    HKCR即咱们上面说的HKEY_CLASSES_ROOT的简写,HKCU->HKEY_CURRENT_USER,HKLM->HKEY_LOCAL_MACHINE,HKU->HKEY_USERS
    WriteRegStr是写入注册表
    $INSTDIR是咱们选择的安装路径
    ${APP_EXECUTABLE_FILENAME}是软件exe名

好了,如今咱们能够打包安装,尝试在浏览器中打开vue-cli-electron://,Windows卸载软件后再在浏览器中打开vue-cli-electron://看还会有提示没有。
优势:万金油模式,自由度大,功能全面。
缺点:麻烦,须要必定的nsis知识。

开发环境配置伪协议

上面两种方式都说完了,这算是一个补充吧,毕竟咱们在开发时不可能写一点就打个包测试,挺费时间的。
咱们在开发时通常直接使用setAsDefaultProtocolClient进行伪协议设置,可是设置后在打开网页上的伪协议连接时会报一个错误,可是打包后又是好好的,这是什么形成开发和打包以后的差别呢?
这里就补充一个知识点,咱们的开发环境是怎么启动的,咱们能够打印一下process.argv,这个就是Electron的启动参数,咱们能够看到开发环境是(Mac同理,路径不一样):

[
  'F:\\work\\electron\\vue-cli-electron\\node_modules\\electron\\dist\\electron.exe',
  'dist_electron'
]

看到这里大多数同窗可能已经明白了,开发环境是启动一个node包的exe,而后传入咱们webpack构建好的目录而启动的服务,而这个参数在打包后则是软件的exe文件

xxxxxxxx\\electron开发.exe

咱们看一下完整的伪协议app.setAsDefaultProtocolClient(protocol[, path, args])protocol是协议名,path是Electron可执行文件路径(也就是exe地址,默认process.execPath),args传递给可执行文件的参数,默认为空数组。
那么也就得出答案了:

app.setAsDefaultProtocolClient('vue-cli-electron')
这个注册时只有protocol和path,故在开发环境经过vue-cli-electron://启动时,只启动了那个node包的exe,咱们后面的构建目录并无在注册时写入。

那么咱们只须要进行一下判断,把这个目录追加到args里便可

if (app.isPackaged) { // 是否处于打包
  app.setAsDefaultProtocolClient('vue-cli-electron')
} else {
  app.setAsDefaultProtocolClient('vue-cli-electron', process.execPath, [
    path.resolve(process.argv[1])
  ])
}

注:如何你开发的协议和打包后的协议名同样的话,同时都启动的话,调用伪协议可能会启动到开发的哦,如今试试本地开发可否经过伪协议拉起咱们的客户端。

原本想把如何获取伪协议连接中的参数也放在这一期的,可是感受这样篇幅太长了不利于阅读,那么放在下一期更新吧,敬请期待。

本系列更新只有利用周末和下班时间整理,比较多的内容的话更新会比较慢,但愿能对你有所帮助,请多多star或点赞收藏支持一下

本文地址:https://xuxin123.com/electron/url-scheme
本文github地址:连接

相关文章
相关标签/搜索