2 votos

'open -a' abre una nueva instancia

En mi script de apple, uso do shell script para llamar al comando open -a "MyApp". Normalmente, cuando la aplicación MyApp ya está abierta, su ventana principal se enfoca en lugar de abrir una nueva instancia.

Sin embargo, en una de mis máquinas el comportamiento es diferente dependiendo de cómo abrí la primera instancia:

  • Si abro MyApp usando el launchpad, luego llamo a open -a "MyApp", se abre una nueva instancia de MyApp.
  • Si abro MyApp usando open -a "MyApp", luego llamadas posteriores a open -a "MyApp" enfocan la ventana principal de la instancia ya abierta.

EDIT: Después de alguna investigación, encontré dos instancias de MyApp. Una en homebrew (que el lanzador no ve por alguna razón) y otra en $HOME/Applications que copié para el lanzador. En particular, cuando ejecuto

osascript -e 'POSIX path of (path to application "MyApp")'

obtengo /opt/homebrew/Cellar/myapp-1.0.0/MyApp.app/

Cuando lanzo MyApp en el lanzador, la aplicación que se abre es la copia en $HOME/Application, mientras que cuando llamo a open -a "MyApp", se abre la que está en /opt/homebrew.

Entonces ahora la pregunta es, ¿de dónde obtiene path to applicacion "MyApp" la ruta? ¿Cómo doy de baja una aplicación así?

4voto

Tohiko Puntos 161

Encontré la solución para usar lsregister para encontrar la lista de aplicaciones y anular los registros no deseados duplicados

alias lsregister=/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister

lsregister -dump | grep path: | grep MiApp

lsregister -u RUTA_NO_DESEADA

0voto

Mockman Puntos 16

Entonces, esto no aborda el problema subyacente al que se enfrentó tu respuesta, pero muestra cómo llevar la aplicación que deseas al frente, utilizando el id unix del proceso.

set bundle to "com.apple.ScriptEditor.id.steppo-timer"
set goodPath to "/opt/homebrew/Cellar/myapp-1.0.0/MyApp.app"

tell application "System Events"

    set ap to application process "steppo timer"

    set bid to (get bundle identifier of ap)
    --> "com.apple.ScriptEditor.id.steppo-timer"
    set appFile to POSIX path of application file of ap
    --> "/Users/home/Library/Scripts/coffee timer.app"

    -- confirm correct app instance
    if bid is equal to bundle and appFile is equal to goodPath then
        set uid to unix id of ap
        log uid -- opcional
        set frontmost of first process whose unix id is uid to true
    end if
end tell

Básicamente, toma la información correcta (predeterminada) para la aplicación y luego la compara con la misma para la aplicación activa actualmente. Si coinciden, se obtiene el id unix de la aplicación en ejecución y se lleva el proceso coincidente al frente. Técnicamente, la parte 'bundle' no es necesaria y puedes prescindir solo del 'path'. Ten en cuenta que la ruta posix en appFile NO termina con un '/', así que recuerda eliminar esto de goodPath, de lo contrario no obtendrás una coincidencia.

Obtuve la idea de esta respuesta en stack overflow y más información de esta respuesta. La segunda respuesta muestra cómo podrías trabajar con una ventana específica de la aplicación.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X