es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

electronJS / Detectar si una aplicación extranjera se está ejecutando (MacOS) (Sandbox) (MAS)

¿Es posible detectar en electronJS si se están ejecutando aplicaciones específicas en MacOS?

Quiero verificar si la aplicación Mail.app está abierta y es importante que el código funcione en el Mac Apple Store (MAS) en el modo de Sandbox.

En AppKit es posible con
var runningApplications: [NSRunningApplication] { get }
https://developer.apple.com/documentation/appkit/nsworkspace/1534059-runningapplications

He escrito un código que funciona, pero no en Sandbox, los comandos de terminal no son posibles:

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) {
       // ¿eliminar la aplicación? 😉 
    } else {
        resolve(null);
    }
}, reject);

¿Alguien tiene una mejor solución para electronJS que funcione en el MAS Sandbox?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no es posible acceder a las aplicaciones en ejecución en MacOS desde dentro de la aplicación de Electron cuando se está ejecutando en el modo de Sandbox de MAS. La aplicación está restringida a su propia sandbox y no puede acceder a otras aplicaciones en ejecución en el sistema.

    Una solución alternativa es utilizar AppleScript para verificar si Mail.app está en ejecución. Con AppleScript, puedes verificar si una aplicación está en ejecución y obtener su ID de proceso. Aquí tienes un ejemplo:

    const {exec} = require('child_process');
    
    function isMailAppRunning() {
      return new Promise((resolve, reject) => {
        const script = `tell application "System Events"
          count (every process whose name is "Mail")
        end tell`;
    
        exec(`osascript -e '${script}'`, (err, stdout, stderr) => {
          if (err) {
            reject(err);
          } else if (stderr) {
            reject(stderr);
          } else {
            const count = parseInt(stdout.trim());
            resolve(count > 0);
          }
        });
      });
    }
    
    isMailAppRunning().then((isRunning) => {
      console.log('La aplicación de correo está en ejecución:', isRunning);
    });
    

    Ten en cuenta que este código necesita tener los permisos de sandbox de la aplicación adecuados configurados para poder ejecutar AppleScript.

Comments are closed.