Evento de “url abierto” del esquema de url de electrones

Hice lo siguiente en mi index.js ;

 electron.remote.app.on("open-url", function(event, url) { console.log("Open URL: " + url); }); 

Esto se activa en Mac OS, pero no en Windows. ¿Hay otro evento o una forma diferente de hacerlo en windows?

Esta es una característica sólo para mac La alternativa más cercana es app.makeSingleInstance (callback) .

Puede organizar que su aplicación se inicie con la url como argumento: myApp my-scheme: // stuff

Luego se llama a la callback llamada con la URL en el proceso de la aplicación que se inició primero.

De la mía similar Q / A en SO : se trata de abrir la aplicación y pasar parámetros con vinculación profunda usando Electron para ambas plataformas (macOS / win32).


Proyecto de electrones mínimo con capacidades de enlace profundo en plataformas macOS / win32 (aplicación de instancia única) ‘electron-deep-linking-mac-win’ en GitHub .


package.json :

 { "name": "electron-deeplinking-macos-win32", "version": "0.0.1", "description": "Minimal Electron application with deep inking (macOS/win32)", "main": "main.js", "scripts": { "start": "electron .", "pack": "build --dir", "dist": "build" }, "repository": "https://github.com/oikonomopo/electron-deep-linking-osx", "author": "oikonomopo", "license": "CC0-1.0", "devDependencies": { "electron": "1.6.6", "electron-builder": "17.1.2" }, "build": { "appId": "oikonomopo.electron-deeplinking-macos-win32", "protocols": { "name": "electron-deep-linking", "schemes": ["myapp"] }, "mac": { "category": "public.app-category.Reference" }, "win": { } } } 

main.js :

 const {app, BrowserWindow} = require('electron') // Module with utilities for working with file and directory paths. const path = require('path') // Module with utilities for URL resolution and parsing. const url = require('url') // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. let mainWindow // Deep linked url let deeplinkingUrl // Force Single Instance Application const shouldQuit = app.makeSingleInstance((argv, workingDirectory) => { // Someone tried to run a second instance, we should focus our window. // Protocol handler for win32 // argv: An array of the second instance's (command line / deep linked) arguments if (process.platform == 'win32') { // Keep only command line / deep linked arguments deeplinkingUrl = argv.slice(1) } logEverywhere("app.makeSingleInstance# " + deeplinkingUrl) if (win) { if (win.isMinimized()) win.restre() win.focus() } }) if (shouldQuit) { app.quit() return } function createWindow () { // Create the browser window. mainWindow = new BrowserWindow({width: 800, height: 600}) // and load the index.html of the app. mainWindow.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true })) // Open the DevTools. mainWindow.webContents.openDevTools() // Protocol handler for win32 if (process.platform == 'win32') { // Keep only command line / deep linked arguments deeplinkingUrl = process.argv.slice(1) } logEverywhere("createWindow# " + deeplinkingUrl) // Emitted when the window is closed. mainWindow.on('closed', function () { // Dereference the window object, usually you would store windows // in an array if your app supports multi windows, this is the time // when you should delete the corresponding element. mainWindow = null }) } // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. app.on('ready', createWindow) // Quit when all windows are closed. app.on('window-all-closed', function () { // On OS X it is common for applications and their menu bar // to stay active until the user quits explicitly with Cmd + Q if (process.platform !== 'darwin') { app.quit() } }) app.on('activate', function () { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (mainWindow === null) { createWindow() } }) // Define custom protocol handler. Deep linking works on packaged versions of the application! app.setAsDefaultProtocolClient('myapp') // Protocol handler for osx app.on('open-url', function (event, url) { event.preventDefault() deeplinkingUrl = url logEverywhere("open-url# " + deeplinkingUrl) }) // Log both at dev console and at running node console instance function logEverywhere(s) { console.log(s) if (mainWindow && mainWindow.webContents) { mainWindow.webContents.executeJavaScript(`console.log("${s}")`) } } 

Descripción del código main.js:

  • En let deeplinkingUrl mantenemos la url proporcionada.

  • En la plataforma macOS, esto se captura en 'open-url' evento 'open-url' , lo configuramos con deeplinkingUrl = url ! (Ver // Protocol handler for osx )

  • En la plataforma win32, esto se guarda en process.argv junto con otros argumentos. Para obtener solo la url provista, deeplinkingUrl = argv.slice(1) . (Ver // Protocol handler for win32 )

  • Como @ Aurélien Nicolas menciona, en el método app.makeSingleInstance verificamos en qué plataforma estamos y establecemos deeplinkingUrl consecuencia. Si estamos en la plataforma win32, la url se encuentra en la variable argv desde la callback, de lo contrario, en macOS ya debería haberse configurado en 'open-url' evento 'open-url' . (Ver // Force Single Instance Application )