From my similar Q / A on SO : it is about opening application parameters and a deep binding pass using Electron for both platforms (macOS / win32).
A minimal electronic project with deep binding capabilities on macOS / win32 platforms (single-instance application) with electronic deep binding-mac-win 'on 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 instances (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.restore() 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 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}")') } }
Description of main.js code:
With let deeplinkingUrl we save the provided url.
On the macOS platform, this is fixed on the 'open-url' event , we set it with deeplinkingUrl = url ! (See //Protocol handler for osx )
On the win32 platform, this is stored in process.argv along with other arguments. To get only the provided url, deeplinkingUrl = argv.slice(1) . (See //Protocol handler for win32 )
As @ Aurélien Nicolas mentions, using the app.makeSingleInstance method app.makeSingleInstance we check which platform we are on and deeplinkingUrl we set deeplinkingUrl accordingly! If we are on the win32 platform, the url is in the argv variable from the callback, otherwise macOS should be set to 'open-url' ! (See //Force Single Instance Application )
oikonomopo
source share