2 votos

¿Cómo puedo conservar los globales en AppleScript entre las invocaciones en Mojave?

Problema

Al parecer, con los cambios de seguridad realizados en Mojave y ahora en adelante, he perdido la capacidad de almacenar globales entre las invocaciones de mis scripts.

Todo lo que quiero hacer es alternar los estados de las conexiones en función de mi ubicación (por ejemplo, el trabajo frente a casa alterna entre Ethernet y WiFi y otras cosas). Quiero almacenar el estado para la próxima vez para que pueda saber lo que la configuración había sido.

No hago desarrollos en XCode (sin embargo programo en otros lenguajes como Python). Todo para AppleScript está en ScriptEditor (quizás pronto script Debugger en su lugar). Por último, soy lo suficientemente hábil para saber cómo escribir los script y guardarlos como aplicaciones. Cualquier otra cosa que necesite utilizar será, con suerte, de un nivel de esfuerzo "plug-and-play".

Ejemplo script

Aquí hay un ejemplo de un script que uso para alternar el estado entre presentaciones y no presentaciones. En este, pCurrentMode ya no se mantiene entre las invocaciones. Bajo High Sierra, se ejecutó sin problemas. Bajo Mojave, no recuerda el estado de la invocación anterior. Tengo algunos otros equivalentes script que hacen lo mismo. Están guardados como archivos .app en la carpeta script (para acceder al menú cuando los necesite).

property pAppsToToggleOFF : {"Mail", "Safari"}
property pAppsToToggleinMSB : {"EasyMP Network Projection"}
property pAppsToToggleinTeach : {"AirServer", "Panopto"}

property blueutil : "/usr/local/bin/blueutil"

property pCurrentMode : "Off"

on run {}

-- ask how to set
set whichMode to choose from list {"Teach", "MSB Show", "Off"} with prompt "How?" default items pCurrentMode
if result is false then return

if (whichMode is equal to pCurrentMode) then return

set pCurrentMode to whichMode as text

set inTeachMode to (whichMode as text is equal to "Teach")
set inMSBMode to (whichMode as text is equal to "MSB Show")
set inONMode to (inTeachMode or inMSBMode)
set inOFFMode to (whichMode as text is equal to "Off")

if (inONMode) then

    -- start presentation mode

    if (inTeachMode) then
        repeat with apptoToggle in pAppsToToggleinTeach
            try
                tell application apptoToggle to activate
            end try
        end repeat
    else if (inMSBMode) then
        repeat with apptoToggle in pAppsToToggleinMSB
            try
                tell application apptoToggle to activate
            end try
        end repeat
    end if

    repeat with apptoToggle in pAppsToToggleOFF
        try
            tell application apptoToggle to quit
        end try
    end repeat

    -- switch to WiFi and turn off bluetooth

    do shell script "scselect WiFi"
    do shell script blueutil & " off"

else if (inOFFMode) then

    -- end presentation modes

    repeat with apptoToggle in pAppsToToggleinTeach
        try
            tell application apptoToggle to quit
        end try
    end repeat

    repeat with apptoToggle in pAppsToToggleinMSB
        try
            tell application apptoToggle to quit
        end try
    end repeat

    -- switch to ethernet and turn on bluetooth

    do shell script "scselect Ethernet"
    do shell script blueutil & " on"

end if

-- show or hide the dock and desktop icons

hidetheDock(inONMode)
showDesktopIcons(not inONMode)

end run

on showDesktopIcons(state)

    set theCmd to "defaults write com.apple.finder CreateDesktop " & state & "&& killall Finder"

    do shell script theCmd

end showDesktopIcons

on hidetheDock(state)

    tell application "System Events" to set the autohide of dock preferences to state

end hidetheDock

Una pregunta general de conclusión

A modo de referencia, cuando empecé a buscar información sobre cómo resolver este problema, como usuario principiante/intermedio de AppleScript, estaba perdido sobre dónde debía ir para obtener la información más reciente para averiguar por qué estaba sucediendo esto ahora. Esto me lleva a hacer un seguimiento basado en una pregunta de hace dos años publicada en este enlace.

Alternativas a AppleScript

En pocas palabras, ¿a dónde van los programadores para encontrar recursos sobre la más reciente prácticas para escribir scripts robustos con AppleScript?

Me topé con el sitio de script Debugger mientras buscaba posteriormente "applescript globals". El sitio ofreció algunas ideas. Me sería difícil leer todos los mensajes del foro para obtener la información que necesito en forma de tutorial y ejemplo. Pero si este es el actual práctica, que así sea.

0 votos

Los comentarios no son para ampliar la discusión; esta conversación ha sido trasladado al chat .

0 votos

La edición para hacer esto sobre la retención global es bienvenida y mejora el valor de esto en gran medida IMO. En lugar de discutir los méritos del estilo de secuencias de comandos en los comentarios (y se alienta el desacuerdo educado) vamos a hacer que en Pregunte a Different Meta o la sala de chat hecha anteriormente para esta discusión.

4voto

red_menace Puntos 111

Guardar las preferencias de la aplicación

Dado que un AppleScript normal guarda las propiedades y los globales en el archivo script, firmar el código o hacer que script(s) sea de sólo lectura evita problemas con la configuración de la accesibilidad de la privacidad debido a la modificación de las aplicaciones, pero esto impide el uso histórico de las propiedades persistentes.

Una solución sería utilizar NSUserDefaults (que es la forma en que las aplicaciones regulares manejan las preferencias), ya sea directamente usando AppleScriptObjC o a través de algo como el PrefsStorageLib biblioteca. Cualquiera de ellos guardará los elementos en ~/Librería/Preferencias/ bajo el identificador del paquete de su aplicación script. En general, se hace algo como:

  • definir las propiedades de sus elementos de preferencia con valores iniciales de partida
  • registrar sus elementos de preferencia con los valores predeterminados del usuario (esto establece un almacén de elementos por defecto)
  • leer sus elementos de preferencia (esto actualizará los elementos del preferences.plist de la aplicación, si lo hay, o utilizará el predeterminado)
  • hacer las cosas de la aplicación
  • guarde sus elementos de preferencia antes de salir

En tu proyecto, añade lo siguiente al principio del script para declarar los frameworks utilizados:

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

Añade un par de manejadores para las cosas por defecto (estoy usando tu pCurrentMode con una clave de preferencia "CurrentMode"):

on getDefaults() -- register and read any previously saved preferences
  tell standardUserDefaults() of current application's NSUserDefaults
    registerDefaults_({CurrentMode:pCurrentMode})
    set pCurrentMode to objectForKey_("CurrentMode") as text
  end tell
end getDefaults

on saveDefaults() -- update the preferences
  tell standardUserDefaults() of current application's NSUserDefaults
    setObject_forKey_(pCurrentMode, "CurrentMode")
  end tell
end saveDefaults

Entonces llame a getDefaults() al principio de su controlador de ejecución, y saveDefaults() al final (para que el pCurrentMode la preferencia sólo se actualiza cuando el script se ejecuta hasta su finalización). Guarda el script como una aplicación (sin la opción "Stay open") y dale un identificador de paquete único (debe haber un Contenido del paquete elemento de la barra de herramientas después de guardar que le dará un fácil acceso).

Cómo encontrar los recursos actuales de AppleScript

Aparte de algunas publicaciones en el blog sobre las nuevas medidas de seguridad, MacScripter / script Depurador foros y Stack Overflow son prácticamente los únicos lugares en los que vas a encontrar algo actual.

Hay algunos libros clásicos de AppleScript como AppleScript: The Definitive Guide y Serie de formación de Apple: AppleScript 1-2-3 pero no son actuales. No parece haber suficiente mercado, incluso la documentación actual de Apple ha sido archivada. Para AppleScriptObjC Nunca hubo mucho más que las contribuciones de Shane Stanley, como Todos los días AppleScriptObjC y el anterior AppleScriptObjC Explored. La intención de Apple parece ser la de utilizar su actual Documentación sobre el cacao y convertirlo si resulta que estás usando otra cosa.

La documentación de AppleScript casi nunca se ha mantenido actualizada (incluso la Notas de la versión de AppleScriptObjC es esencialmente una sola página de 2009), pero la actual Guía del lenguaje AppleScript (2016), aunque haya sido archivado, sigue siendo relevante, ya que el lenguaje en sí no ha cambiado tanto.

0 votos

He añadido un párrafo con esas sugerencias. script Debugger es una excelente alternativa al script Editor (es gratuito después de la prueba, las funciones avanzadas como la depuración requieren una licencia), y la comunidad está al tanto de la mayoría de este tipo de cuestiones.

1 votos

Gracias de nuevo. Como ve, mi mensaje quedó en suspenso. Su respuesta actual da todo lo que necesitaba a lo que estaba en espera. He modificado mi post para activarlo (espero). Cuando sea así, tal vez podrías reestructurar tu respuesta en secciones como "Cómo resolver tu problema" y "Dónde encontrar recursos actuales". Entonces, sería "de oro" como diría una vez un compañero mío.

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