Is it possible to detect in electronJS if are specific Apps are running on MacOS?
I want to check, if the Mail.app is open and its important, that the code works in Mac Apple Store (MAS) in Sandbox Mode.
In AppKit it is possible with
var runningApplications: [NSRunningApplication] { get }
https://developer.apple.com/documentation/appkit/nsworkspace/1534059-runningapplications
I have wrote an code, which is working, but not in Sandbox, terminal commands are not possible:
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 &&
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);
Has anyone a better solution for electronJS which works in MAS Sandbox?
I found a solution for it:
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);
});