Search code examples
ionic-frameworkelectroncapacitorelectron-builderionic5

Build Electron app using Ionic v5 with @capacitor-community/electron


I've been sitting last week with the following problem - I wanted to compile my Ionic project not only to android version, but also to electron desktop app. But, every time when I deployed packed electron version, I've got a white screen.

How to reproduce problem:

# i create simple angular app
ionic start example-app tabs --type angular 
cd example-app
# i add @capacitor-community version of electron, since the original electron is deprecated
npm i @capacitor-community/electron
# required to get a www folder
ionic build
# add electron folder to project
npx cap add @capacitor-community/electron
# now we work inside electron project...
cd electron
# we can build project
npm run build
# we can start live project
npm run electron:start-live
# and now we have crash - just a blank white window
npm run electron:pack

Solution

  • I've been able to get visible window in deployed version, making the following change inside ./electron/src/setup.ts file. You need to find the following fragment:

    // Set a CSP up for our application based on the custom scheme
    export function setupContentSecurityPolicy(customScheme: string): void {
      session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
        callback({
          responseHeaders: {
            ...details.responseHeaders,
            'Content-Security-Policy': [
              electronIsDev
                ? `default-src ${customScheme}://* 'unsafe-inline' devtools://* 'unsafe-eval' data:`
                : `default-src ${customScheme}://* 'unsafe-inline' data:`,
            ],
          },
        });
      });
    }
    

    and change it to:

    // Set a CSP up for our application based on the custom scheme
    export function setupContentSecurityPolicy(customScheme: string): void {
      session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
        callback({
          responseHeaders: {
            ...details.responseHeaders,
            'Content-Security-Policy': [
                 `default-src ${customScheme}://* 'unsafe-inline' devtools://* 'unsafe-eval' data:`
            ],
          },
        });
      });
    }