在电子应用程序中的安装过程中注册自定义协议

时间:2017-08-22 04:46:48

标签: electron electron-builder

您好我是电子新手,想知道如何在应用安装过程中为应用注册自定义协议。

我正在使用电子构建器来构建应用程序。这是构建构建代码

"build": {
"appId": "com.test.testapp",
"productName": "testapp",
"asar": true,
"protocols": [{
  "name": "testapp",
  "schemes": [ "testapp" ]
}],
"nsis": {
  "oneClick": false,
  "perMachine": true,
  "allowToChangeInstallationDirectory": true,
  "runAfterFinish": false,
  "createDesktopShortcut": true
},
"squirrelWindows": {
  "msi": true
},
"directories": {
  "output": "distribution"
}

我知道通过添加以下行注册自定义协议

 app.setAsDefaultProtocolClient("testapp");

但只有在我第一次运行应用程序时才会这样做。

我不希望用户无法保证用户在安装后启动应用程序。

有没有办法可以使用电子修建器

在安装过程中注册自定义协议

4 个答案:

答案 0 :(得分:2)

我还是电子和电子制造商的新手,但已经为NSIS-target解决了这个问题。首先,我应该注意app.setAsDefaultProtocolClient用于处理应用程序内部的自定义协议,据我所知。您需要使用电子构建器本身注册此自定义协议。

其次我需要在NSIS和squirrelWindows之间做出选择。我理解NSIS是最好的,因为Squirrel支持较少并且有一些问题。我再也不是专家,但我读了一些关于它的东西。所以squirrelWindows部分是多余的。您没有指定win.target,默认情况下为"nsis"

NSIS目标的自定义协议注册存在问题。您可以在此处阅读更多内容:Protocol (scheme) for windows但有一种解决方法。您需要在installer.nsh文件夹中创建一个名为build的文件,其中包含以下内容:

!macro customInstall DetailPrint "Register evehq-ng URI Handler" DeleteRegKey HKCR "evehq-ng" WriteRegStr HKCR "evehq-ng" "" "URL:evehq-ng" WriteRegStr HKCR "evehq-ng" "EveHQ NG SSO authentication Protocol" "" WriteRegStr HKCR "evehq-ng\DefaultIcon" "" "$INSTDIR\${APP_EXECUTABLE_FILENAME}" WriteRegStr HKCR "evehq-ng\shell" "" "" WriteRegStr HKCR "evehq-ng\shell\Open" "" "" WriteRegStr HKCR "evehq-ng\shell\Open\command" "" "$INSTDIR\${APP_EXECUTABLE_FILENAME} %1" !macroend

evehq-ng替换为您的协议字符串,将EveHQ NG SSO authentication Protocol替换为您的协议说明。

之后,您必须将nsis.perMachine设置为true。

我还没有为Linux解决这个问题但是朝着这个方向努力。您可以在我的概念证明项目中查看我的代码:EveHQ-NG proof of concepts application

如果您将为Linux和MacOS解决此问题,请在此处或GitHub上以某种方式向我发送消息。

希望它有所帮助。

答案 1 :(得分:1)

由于您使用的是electron-builder,因此可以执行以下操作:

"build": {
    ... other top level electron-builder keys ...
    "protocols": [
       {
           "name": "Custom Protocol Name",
           "schemes": [
               "customProtocol"
           ]
       }
    ]
}

如果您想使用自己的应用程序处理customProtocol://some-link

更多详细信息: https://www.electron.build/configuration/configuration

(搜索protocols;到目前为止,该文档格式有点不正确。它应该是与上方的fileAssociations键相同的顶级键。)

答案 2 :(得分:1)

自定义协议仅在打开电子应用程序后仍然打开。而且我还在构建文件夹中添加了 installer.nsh 。我不知道怎么了。

package.json

    {
  "name": "electron-project",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "electron .",
    "pack": "build --dir",
    "dist": "build"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron": "^3.0.8",
    "electron-builder": "^20.38.5"
  },
  "dependencies": {
    "axios": "^0.18.0"
  },
  "build": {
    "win": {
      "target": "nsis"
    },
    "nsis": {
      "oneClick" : false , 
      "allowToChangeInstallationDirectory": true, 
      "include" : "dist/installer.nsh" , 
      "perMachine" : true 
    },
    "protocols": [{
      "name": "electron-deep-linking",
      "schemes": [
        "test"
      ]
    }],
    "mac": {
      "category": "public.app-category.Reference"
    }
  }
}

main.js

const { app, BrowserWindow } = require('electron')
const path = require('path')
const url = require('url')
let mainWindow

function createWindow() {
  mainWindow = new BrowserWindow({ width: 800, height: 600 })

  mainWindow.loadURL(url.format({
    pathname: path.join(__dirname, 'index.html'),
    protocol: 'file:',
    slashes: true
  }))

  mainWindow.on('closed', function () {

    mainWindow = null
  })
}
app.setAsDefaultProtocolClient('test')

app.on('ready', createWindow)

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', function () {
  if (mainWindow === null) {
    createWindow()
  }
})

答案 3 :(得分:0)

电子提供了一种非常简单的方法来在客户端计算机(Windows,Mac)中注册自定义协议URL

这样,我们可以在计算机中注册和删除自己的自定义协议

const {app} = require('electron')
app.on('ready', onReady)

function onReady() {

    .... // write other code 
    if(!app.isDefaultProtocolClient('quickstart')) {
        app.setAsDefaultProtocolClient("quickstart", 'C:\\Users\\karthi\\electron-quick-start\\electron-quick-start-win32-x64\\electron-quick-start.exe');

    }
}

此代码将在计算机中注册自定义协议,然后您可以使用quickstart://params之类的浏览器打开应用程序

用于删除计算机中的自定义协议

app.removeAsDefaultProtocolClient("quickstart", 'C:\\Users\\karthi\\electron-quick-start\\electron-quick-start-win32-x64\\electron-quick-start.exe');

在这里,我使用了电子快速入门应用,并使用electron-packager npm构建了我的应用

有关更多信息,自定义协议electron-protocol