当应用程序未在后台运行时,不会触发电子"打开网址"事件



当我在macOS上运行电子应用程序时,我想读取deeplinkingUrl附带的所有参数。当我的应用程序在Windows上通过协议调用时,我可以从process.argv中获得深度链接URL。但这在macOS上是不可能的,因为process.argv给出-psn...,并且在应用程序首次启动时只给出一次该参数。

当我的应用程序不在macOS后台运行时,我想通过从浏览器调用协议来触发open-url。但此事件仅在应用程序运行时触发。当应用程序未运行时,应用程序将显示,但它不会根据深度链接URL附带的操作进行导航。

我也在package.json:中写过这些

"protocols": {
"name": "My App",
"schemes": [
"myapp"
]
}

来自electron.js:的

let clickToCallObj = {};
let deeplinkingUrl;
let mainWindow;
app.on('open-url', (event, url) => {
event.preventDefault();
const isDefaultProtocolClientSet = app.isDefaultProtocolClient('myapp');
deeplinkingUrl = url;
clickToCallObj.operation = utils.getOperation(deeplinkingUrl); //e.g. myapp:/call/12345 -> operation: call
if (mainWindow && isDefaultProtocolClientSet) {
mainWindow.isMinimized() ? mainWindow.restore() : null;
mainWindow.focus();
sendClickToCallEvent(clickToCallObj, deeplinkingUrl); //takes the action with coming operation and deeplinkingUrl
}
});

那么,当我在macOS上调用我的应用程序时,当它不在后台运行时,我如何获得深度链接URL呢?

  1. app.on('will-finish-launching', )事件应在app.on('ready', )之前捕获
  2. isInvokedWhileAppIsNotRunning参数被设置为true,并且在应用程序加载完成之后被控制
  3. Based on electron documentation, open-url event has used in will-finish-launching event regarding their occurrence order.

    // Protocol handler for osx while application is not running in the background.
    app.on ('will-finish-launching' , () => {
    app.on('open-url', (event, url) => {
    
    event.preventDefault();
    deeplinkingUrl = url;
    const isDefaultProtocolClientSet    = app.isDefaultProtocolClient(getProtocolName());
    clickToCallObj.operation            = utils.getOperation(deeplinkingUrl);
    if (isDefaultProtocolClientSet) {
    clickToCallObj.isInvokedWhileAppIsNotRunning = true;
    }
    });
    });
    // Protocol handler for osx while the app is running in the background
    app.on('open-url', (event, url) => {
    event.preventDefault();
    const isDefaultProtocolClientSet = app.isDefaultProtocolClient(getProtocolName());
    clickToCallObj.operation = utils.getOperation(url);
    if (mainWindow && isDefaultProtocolClientSet) {
    mainWindow.isMinimized() ? mainWindow.restore() : null;
    mainWindow.focus();
    sendClickToCallEvent(clickToCallObj, url);
    }
    });
    

最新更新