2010-03-19 17 views
31

Soy nuevo en el mundo de la programación de Cocoa y deseo agregar el soporte de Applescript a mi aplicación. Los ejemplos en el sitio web de Apple parecen desactualizados.¿Cómo agrego el soporte de Applescript a mi aplicación Cocoa?

¿Cómo agrego el soporte de Applescript a mi aplicación Cocoa?

+0

No es claro si esta pregunta se trata de hacer una aplicación de secuencias de comandos o la invocación de scripts desde una aplicación . –

Respuesta

4

Las versiones modernas de Cocoa pueden interpretar directamente la lista de propiedades de definición de scripts (.sdef), por lo que todo lo que necesita hacer para obtener soporte AppleScript básico es crear el sdef según los documentos, agréguelo a su fase "copiar paquetes de recursos" y declara compatibilidad con AppleScript en tu Info.plist. Para acceder a objetos distintos de NSApp, debe definir especificadores de objetos, de modo que cada objeto conozca su posición en la jerarquía del mundo de scripting. Eso le permite manipular kvc las propiedades del objeto y la capacidad de usar métodos de objetos como simples comandos de scripts.

+3

Sdef Editor puede ayudar. http://www.shadowlab.org/Software/sdefeditor.php –

+0

"Para acceder a objetos que no sean NSApp, debe definir especificadores de objetos": ¿dónde está esto documentado? ¿Puedes proporcionar un enlace directo? – hendrik

+0

Enlace de trabajo para Sdef Editor: https://www.shadowlab.org/softwares/sdefeditor.php – doekman

41
  1. Si desea enviar AppleScript de su aplicación y necesita una aplicación de un recinto de seguridad, es necesario crear un derecho temporal

  2. Es necesario añadir esas dos llaves en su info.plist

    <key>NSAppleScriptEnabled</key> 
    <true/> 
    <key>OSAScriptingDefinition</key> 
    <string>MyAppName.sdef</string> 
    

... por supuesto que tiene que cambiar "MyAppName" a nombre de su aplicación

  1. Cree un archivo .sdef y agréguelo a su proyecto. El curso ulterior ahora depende en gran medida de las necesidades de su aplicación, se encuentran:

    1. Clase Elementos (crear un objeto a partir de AppleScript)
    2. los elementos de mando (anular NSScriptCommand y ejecutar comandos "verbo-como")
    3. Enumeración Elementos
    4. de Registros Tipo Elementos
    5. valor de tipo de elementos (KVC)
    6. cacao Elementos

    -

    Ir aquí para encontrar una descripción detallada y muchos detalles sobre su aplicación: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_script_cmds/SAppsScriptCmds.html

  2. me encontré trabajando con clase y KVC elementos muy complicado, ya que sólo quería ejecutar un solo comando, nada sofisticado. Entonces, para ayudar a otros, aquí hay un ejemplo de cómo crear un nuevo comando simple con un argumento. En este ejemplo se va a "lookup" una cadena como esta:

    tell application "MyAppName" 
        lookup "some string" 
    end tell 
    
  3. El archivo .sdef para este comando es el siguiente:

    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd"> 
    
    <dictionary title="MyAppName"> 
        <suite name="MyAppName Suite" code="MApN" description="MyAppName Scripts"> 
         <command name="lookup" code="lkpstrng" description="Look up a string, searches for an entry"> 
          <cocoa class="MyLookupCommand"/> 
          <direct-parameter description="The string to lookup"> 
           <type type="text"/> 
          </direct-parameter> 
         </command> 
        </suite> 
    </dictionary> 
    
  4. crear una subclase de NSScriptCommand y el nombre de MyLookupCommand

    The MyLookupCommand.h

    #import <Foundation/Foundation.h> 
    
    @interface MyLookupCommand : NSScriptCommand 
    
    @end 
    

    El MyLookupCommand.m

    #import "MyLookupCommand.h" 
    
    @implementation MyLookupCommand 
    
    -(id)performDefaultImplementation { 
    
        // get the arguments 
        NSDictionary *args = [self evaluatedArguments]; 
        NSString *stringToSearch = @""; 
        if(args.count) { 
         stringToSearch = [args valueForKey:@""]; // get the direct argument 
        } else { 
         // raise error 
         [self setScriptErrorNumber:-50]; 
         [self setScriptErrorString:@"Parameter Error: A Parameter is expected for the verb 'lookup' (You have to specify _what_ you want to lookup!)."]; 
        } 
        // Implement your code logic (in this example, I'm just posting an internal notification) 
        [[NSNotificationCenter defaultCenter] postNotificationName:@"AppShouldLookupStringNotification" object:stringToSearch]; 
        return nil; 
    } 
    
    @end 
    

    Eso es básicamente la misma. El secreto para esto es crear la subclase NSScriptCommand y anular realizar la ejecución predeterminada de Default. Espero que esto ayude a alguien para conseguir que sea más rápido ...

+2

Gracias por esto. Solo para agregar. La primera vez que configura esto y realiza cualquier cambio después. Tendrá que volver a ejecutar y crear la aplicación. No solo construir También salga y reinicie Applescript Editor para borrar su caché. Descubrí esto por el camino difícil por prueba y error. Pero más tarde, cuando leí los documentos (en parte, de todos modos), se confirmó que era necesario hacerlo :-) – markhunte

+1

La mejor respuesta de scripting de todos los tiempos. Gracias. – mohacs

+0

El parámetro directo no se debe obtener así. Simplemente puede usar 'self.directParameter' en su subclase' NSScriptCommand'. –

1

Un ejemplo sencillo para que pueda empezar,

lugar un guión (llamado de diálogo) en la carpeta de documentos, entonces puede ejecutarlo desde Xcode

Lo bueno de mantener el script externo es la posibilidad de editarlo fuera de Xcode. Yo recomendaría la adición de comprobar el error si se hizo comenzar a editar como el applescript no puede compilar

quizá comprobar con

if(scriptObject.isCompiled){ 
Cuestiones relacionadas