ElectronJS / Определить, запущено ли чужое приложение (macOS) (песочница) (MAS)

#javascript #macos #electron #appstore-sandbox

#javascript #macos #electron #appstore-песочница

Вопрос:

Возможно ли в ElectronJS определить, запущены ли конкретные приложения на macOS?

Я хочу проверить, открыто ли Mail.app и важно, чтобы код работал в Mac Apple Store (MAS) в режиме изолированной среды.

В AppKit это возможно с помощью var runningApplications: [NSRunningApplication] { get }
https://developer.apple.com/documentation/appkit/nsworkspace/1534059-runningapplications

Я написал код, который работает, но не в песочнице, команды терминала невозможны:

  import { exec } from "child_process";
 ...

 isRunning(query: string): Promise<unknown> {
    return new Promise((resolve, reject) => {
        const cmd = `ps aux | grep "${query}" | grep -v grep`;


        exec(cmd, (err, stdout, stderr) => {

            if (stderr) {
                reject(stderr);
                return false;
            }

            const lines = stdout.split("n");
            let active = null;
            let pid = null;

            for (let index = 0; index < lines.length; index  ) {
                const line = lines[index];

                if (
                    line.indexOf(query) !== -1 amp;amp;
                    line.indexOf(USERNAME) !== -1

                ) {
                    active = line;
                    break;
                }
            }

            if (active) {
                const activeData = active.replace(/(s )/g, 't').split('t');
                pid = activeData.length > 2 ? activeData[1] : null;
            }

            resolve(pid);
        });
    });
}

this.isRunning('Mail.app/Contents/MacOS/Mail').then(pid => {
    if (pid) {
       // kill the app? 😉 
    } else {
        resolve(null);
    }
}, reject);
 

Есть ли у кого-нибудь лучшее решение для ElectronJS, которое работает в песочнице MAS?

Ответ №1:

Я нашел решение для этого:

 const script = `
if application "Mail" is running then
    copy "true" to stdout
else
    copy "false" to stdout
end if
`;

exec(`osascript -e '${script}'`,  (err, stdout, stderr) => {
    if (stderr) {console.log("error", stderr); return;}

    console.log("stdout", stdout);
});