Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

355
Vistas
Diferencia de MAC OS X entre los scripts de shell "open APP.app" y "APP.app/content/MacOs/APP"

De alguna manera tengo un problema, si llamo a una aplicación dos o varias veces, pero solo se debe ejecutar una instancia (lo cual es deseable).

Primero, algunos antecedentes (probablemente necesarios):

  • trabajando en MAC OS X El Capitan (10.11.6)
  • Tengo una aplicación hecha por node.js, electron y compilada por "npm build -m" (llamémosla APP.app)
  • Instalé la aplicación App.app en la carpeta del programa al abrir el archivo dmg integrado y moverlo a la carpeta del programa
  • Luego inicio la aplicación App.app haciendo clic en el ícono App.app en la carpeta del programa
  • La aplicación comienza con una ventana visible y también tiene un proceso oculto en segundo plano ejecutándose
  • Si cierro la ventana visible, App.app-Icon permanece en el dock (lo cual está bien, ya que el proceso en segundo plano aún se está ejecutando)
  • Ahora (y esta es la diferencia con la compilación de Windows y la ejecución en Windows), si vuelvo a hacer clic en App.app-Icon en la carpeta del programa, solo obtengo un enfoque en la aplicación que ya se está ejecutando EN LUGAR de abrir la ventana y cierre la aplicación anterior (puedo ver el cambio de enfoque/activación por el nombre del menú de cambio al lado del logotipo de Apple en la parte superior de la pantalla; se convierte en "Aplicación")
  • el cierre de la instancia de ejecución anterior se define en código de electrones en el método init de la siguiente manera:

     var shouldQuit = app.makeSingleInstance(function (commandLine, workingDirectory) { console.info('starting new instance'); initInternal(commandLine); // Someone tried to run a second instance, we should focus our window. var windows = options.closeWindowsOnRestart ? Browser.getAllWindows() : appWindows.slice(); windows.forEach(function (val, index) { val.close(); }); readyCallback(); });

Entonces, hice algunos deberes y pude descifrar lo siguiente:

  • mi App.app-icon-click debería parecerse a open /Applications/App.app
  • con esto, obtengo el mismo problema que el descrito anteriormente si lo vuelvo a llamar (solo enfoca la ventana ya abierta)
  • Ahora viene la parte divertida. Si abro la aplicación llamando directamente a /Applications/App.app/content/MacOS/App.app , la instancia de la aplicación anterior se cierra y se inicia la nueva App.app-application
  • Leí el manual open y pude darme cuenta de que si uso el indicador -n , la aplicación también inicia con éxito una nueva instancia. ( open /Applications/App.app -n )

Me preguntaba ¿POR QUÉ? ¿Tienes alguna pista? ¿Cuál es la diferencia entre la llamada abierta y directa de la aplicación?

Sugiero que info.pklist en App.app-package haga que la llamada abierta sea diferente a la llamada directa de App.app.

Por cierto: Desafortunadamente, ya intenté agregar bloques de captura para depurar el problema, pero open no da una salida a la terminal, solo abre la llamada mientras que la llamada directa no arroja un error y todo funciona bien. De todos modos, creo que es más un problema de MAC OS X que un problema de App.app.

Ojalá haya alguien con los mismos problemas y una solución para mí.

No dude en solicitar más detalles, si es necesario.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Version corta:

  • open inicia la aplicación con LaunchService (y posibles parámetros de inicio agregados en info.plist)
  • mientras que la llamada directa de la aplicación simplemente inicia la aplicación sin ninguna otra opción de inicio

*Versión larga *

Leí el manual abierto ( man open ; Fuente: https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/open.1.html ) y pude darme cuenta de que "el la aplicación predeterminada según lo determinado a través de LaunchServices se usa para abrir los archivos especificados" si hace clic en un elemento.

Así que leí la documentación de LaunchService y pude descifrar lo siguiente:

"Apertura de elementos por referencia del sistema de archivos [...] forma predeterminada: si el elemento designado es una aplicación: [...] Si la aplicación ya se está ejecutando, se activa (se trae al frente de la pantalla) y se envía un evento de Apple 'rapp' ("reabrir aplicación")".

(Fuente: https://developer.apple.com/library/content/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCTasks/LSCTasks.html#//apple_ref/doc/uid/TP30000999-CH203-TP9 )

Esto refleja exactamente mi observación de que si hago clic en el ícono por segunda vez, la aplicación simplemente se enfoca/activa.

Por lo tanto, necesito la posibilidad de decirle a la aplicación que abra una nueva instancia (evento oapp) en lugar de activar la aplicación ya abierta (evento rapp)

La lectura adicional me lleva a la siguiente información:

"Opciones de inicio Al abrir una aplicación (ya sea sola o para abrir uno o más documentos o URL), puede especificar varias opciones de inicio para controlar la forma en que se inicia o activa. Estas pueden incluir: [...] Si para iniciar una nueva instancia de la aplicación, incluso si ya se está ejecutando otra instancia"

(Fuente: https://developer.apple.com/library/content/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCConcepts/LSCConcepts.html#//apple_ref/doc/uid/TP30000999-CH202-BABBJHID )

Por lo tanto, solo necesito agregar la "opción de lanzamiento" para definir que se debe crear una nueva instancia en lugar de activar la existente. Pero no está escrito cuál es la opción de inicio y cómo se aplicarán a la aplicación (sugiero que pertenezca al archivo info.plist).

Entonces, al menos esta es la respuesta a mi pregunta original, así que la publiqué aquí.

open: inicia la aplicación con el servicio de inicio (y los parámetros de opción definidos en info.plist), mientras que la llamada directa de la aplicación simplemente inicia la aplicación sin ninguna otra opción de inicio

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda