Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

367
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda