Pregunta ¿Cómo agrego compatibilidad con Applescript a mi aplicación Cocoa?


Soy nuevo en el mundo de la programación de Cocoa, y quiero agregar el soporte de Applescript a mi aplicación. Los ejemplos en el sitio web de Apple parecen desactualizados.

¿Cómo agrego compatibilidad con Applescript a mi aplicación Cocoa?


32
2018-03-19 18:11


origen


Respuestas:


  1. Si desea enviar AppleScript desde su aplicación y necesita una aplicación de espacio aislado, debe crear un derecho temporal

  2. Necesita agregar esas dos claves en su info.plist

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

... por supuesto, debes cambiar "MyAppName" al nombre de tu aplicación

  1. Crea un archivo .sdef y agrégalo a tu proyecto. El curso adicional ahora depende en gran medida de las necesidades de su aplicación, hay:

    1. Elementos de clase (crea un objeto de AppleScript)
    2. Elementos de comando (anula NSScriptCommand y ejecuta comandos "verbales")
    3. Elementos de enumeración
    4. Elementos de tipo registro
    5. Elementos de tipo de valor (KVC)
    6. Elementos de cacao

    -

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

  2. Me pareció muy complicado trabajar con Class y KVC Elements, ya que solo quería ejecutar un único comando, nada sofisticado. Entonces, para ayudar a otros, aquí hay un ejemplo de cómo crear un nuevo simple mando con un argumento En este ejemplo, "buscará" una cadena como esta:

    tell application "MyAppName"
        lookup "some string"
    end tell
    
  3. El archivo .sdef para este comando se ve así:

    <?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. Cree una subclase de NSScriptCommand y asígnele el nombre MyLookupCommand

    El MyLookupCommand.h

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

    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 eso. El secreto para esto es subclasificar NSScriptCommand y anular performDefaultImplementation. Espero que esto ayude a alguien a obtenerlo más rápido ...


42
2018-05-27 12:30



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 básico de AppleScript es crear el sdef según los documentos, agregarlo a su fase "copiar paquetes de recursos" y declarar el soporte de AppleScript en su 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.


4
2018-03-19 20:20



Un simple ejemplo para comenzar,

coloca una secuencia de comandos (diálogo con nombre) en la carpeta de documentos y luego puedes ejecutarlo desde Xcode

NSArray *arrayPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDirectory = [arrayPaths objectAtIndex:0];
    NSString *filePath = [docDirectory stringByAppendingString:@"/dialog.scpt"];

     NSAppleScript *scriptObject = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:nil];

 [scriptObject executeAndReturnError:nil];

Lo bueno de mantener el script externo es la capacidad de editarlo fuera de Xcode. Recomendaría agregar la comprobación de errores si comenzó a editar, ya que AppleScript podría no compilarse

tal vez consultar con

if(scriptObject.isCompiled){

1
2017-10-23 14:23