2016-07-19 10 views
3

Ich habe folgendes in meinem index.js;Elektron-URL-Schema "Open-URL" Ereignis

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

Dies wird in Mac OS ausgelöst, aber nicht in Windows. Gibt es ein anderes Ereignis oder eine andere Möglichkeit, es in Windows zu tun?

Antwort

3

Dies ist eine Nur-Mac-Funktion. Die nächste Alternative ist app.makeSingleInstance(callback).

Sie können für Ihre Anwendung arrangieren wird mit der URL als Argument ins Leben gerufen: myApp my-Schema: // Sachen

Dann callback mit der URL in welcher auch immer app Prozess zum ersten Mal gestartet wurde aufgerufen wird.

1

From mine similar Q/A at SO: Es geht darum, App zu öffnen und Parameter mit Deep-Linking mit Electron für beide Plattformen (macOS/win32) zu übergeben.


Minimal Elektronen Projekt mit DeepLinking Fähigkeiten in macOS/win32-Plattformen (Single Instance Application) 'electron-deep-linking-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 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.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'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}")`) 
    } 
} 

main.js Code Beschreibung:

  • Bei let deeplinkingUrl behalten wir die angegebene URL bei.

  • Auf der macOS-Plattform ist dies bei erfasst, wir setzen es mit deeplinkingUrl = url! (Siehe // Protocol handler for osx)

  • Bei win32-Plattform wird dies zusammen mit anderen Argumenten bei process.argv gespeichert. Um nur die angegebene URL zu erhalten, deeplinkingUrl = argv.slice(1). (Siehe // Protocol handler for win32)

  • Wie @Aurélien Nicolas erwähnt, bei app.makeSingleInstance method überprüfen wir, in der Plattform, die wir sind, und wir setzen deeplinkingUrl entsprechend! Wenn wir auf Win32-Plattform sind, ist die URL argv Variable von Callback, sonst bei macOS sollte bereits auf 'open-url' Event gesetzt werden! (Siehe // Force Single Instance Application)

+0

Es funktioniert nicht in Windows für mich. Funktioniert das nur, wenn wir die App auf der Plattform installieren? ODER kann ich es irgendwie im Dev-Modus testen? –

+0

@MuhammadYawarAli, wenn ich mich richtig erinnere, um einen Protokoll-Handler für Ihre App zu registrieren, müssen Sie das Installationsprogramm machen, das es registrieren wird. (mit Electron-Builder-Projekt, um unsere App zu paketieren) Also ja, Sie sollten zuerst die App installieren. – oikonomopo

+0

ok ich werde versuchen, ein installer zu erstellen, aber es hat auch im dev-modus für mac os funktioniert. –

Verwandte Themen