#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);
});