Nous avons une application de cryptographie électronique qui signe les transactions (entre autres).
Nous voulons que d'autres sites Web aient la possibilité d'avoir un bouton qui ouvre cette application électronique, pré-rempli avec certains paramètres (les informations de transaction).
le débit est:
Cela peut être fait lors de l'exécution ou lors de l'installation.
appelant app.setAsDefaultProtocolClient
avec le code ce Gist , qui est essentiellement:
app.setAsDefaultProtocolClient("my-app")
Mais après avoir mis my-app://foo?bar=baz
dans chrome chrome, j'obtiens la fenêtre contextuelle suivante, et appuyer sur open-xdg ne fait rien (à part fermer la fenêtre contextuelle)
Peut-être existe-t-il un moyen de le faire lors de l'installation via générateur d'électrons ?
Merci d'avance pour l'aide, je n'ai aucune idée de comment procéder ici!
Comme cela peut être pertinent pour ce que je fais au travail, j'ai décidé d'essayer. Je n'ai testé cela que sur OSX!
J'ai regardé la documentation de app.setAsDefaultProtocolClient et il dit ceci:
Remarque: Sous macOS, vous ne pouvez enregistrer que les protocoles qui ont été ajoutés à info.plist de votre application, qui ne peuvent pas être modifiés au moment de l'exécution. Vous pouvez cependant modifier le fichier avec un simple éditeur de texte ou script pendant la construction. Veuillez consulter la documentation d'Apple pour plus de détails.
Ces protocoles peuvent être définis lors de l'empaquetage de votre application avec electron-builder
. Voir build
:
{
"name": "foobar",
"version": "1.0.0",
"main": "main.js",
"scripts": {
"start": "electron .",
"dist": "electron-builder"
},
"devDependencies": {
"electron": "^3.0.7",
"electron-builder": "^20.38.2"
},
"dependencies": {},
"build": {
"appId": "foobar.id",
"mac": {
"category": "foo.bar.category"
},
"protocols": {
"name": "foobar-protocol",
"schemes": [
"foobar"
]
}
}
}
Dans votre fil principal:
const {app, BrowserWindow} = require('electron');
let mainWindow;
function createWindow () {
mainWindow = new BrowserWindow({width: 800, height: 600})
mainWindow.loadFile('index.html');
}
app.on('ready', createWindow);
var link;
// This will catch clicks on links such as <a href="foobar://abc=1">open in foobar</a>
app.on('open-url', function (event, data) {
event.preventDefault();
link = data;
});
app.setAsDefaultProtocolClient('foobar');
// Export so you can access it from the renderer thread
module.exports.getLink = () => link;
Dans votre thread de rendu:
Remarquez l'utilisation de l'API remote pour accéder à la fonction getLink
exportée dans le thread principal
<!DOCTYPE html>
<html>
<body>
<p>Received this data <input id="data"/></p>
<script>
const {getLink} = require('electron').remote.require('./main.js');
document.querySelector('#data').value = getLink();
</script>
</body>
</html>
Exemple
<a href="foobar://abc=1">open in foobar</a>
Cela vous permet également de lancer à partir de la ligne de commande:
open "foobar://xyz=1"
Comment revenez-vous à l'appelant d'origine?
Je suppose que lorsque vous lancez l'application, vous pouvez inclure l'URL de l'appelant:
<a href="foobar://abc=1&caller=example.com”>open in foobar</a>
Lorsque votre application électronique termine le traitement des données, elle renvoie simplement cette URL
Crédits
La plupart de mes conclusions sont basées sur: