2011-05-14 13 views
6

Estoy tratando de agregar un soporte trivial de AppleScript a una aplicación Cocoa. La aplicación realiza un control periódicamente y solo quiero poder indicar que lo haga a pedido.Hacer que la aplicación Cocoa responda al comando simple de AppleScript

Estoy tratando de seguir el ejemplo de Apple SimpleScriptingVerbs.

He subclase NSScriptCommand de la siguiente manera:

Cabecera:

#import <Cocoa/Cocoa.h> 

@interface rdrNotifierUpdateCommand : NSScriptCommand { 

} 
-(id)performDefaultImplementation; 
@end 

Implementación:

#import "rdrNotifierUpdateCommand.h" 
#import "rdrNotifierAppDelegate.h" 

@implementation rdrNotifierUpdateCommand 

-(id)performDefaultImplementation { 
    NSLog(@"Works at last"); 
    [((rdrNotifierAppDelegate *)[[NSApplication sharedApplication] delegate]) 
    checkForNewItems]; // This just fires the timer 
    return nil; 
} 
@end 

Mi archivo .sdef es la siguiente (y el problema parece estar ahí, pero yo no lo puede encontrar):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd"> 
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude"> 
    <xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/> 
    <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities."> 
     <command name="do update" code="rdrNUpdt" description="Check for new items"> 
      <cocoa class="rdrNotifierUpdateCommand"/> 
     </command> 
    </suite> 
</dictionary> 

El Info.plist está configurado correctamente.

Pero, cuando trato de ejecutar la siguiente secuencia de comandos en el editor de AppleScript:

tell application "rdrNotifier" 
    do update 
end tell 

recibo un error de "actualización" variable no se define.

Puedo abrir el diccionario para mi aplicación desde el Editor de AppleScript (es decir, se ha registrado correctamente).

Editar: Encontrado una solución

El problema era de hecho en el archivo sdef: No estaba especificando que la aplicación puede responder al comando. Mi definición final es la siguiente (código Obj-C sin cambios):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd"> 
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude"> 
    <!-- I have removed the standard suite as the application does not open, print... --> 
    <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities."> 
    <command name="do update" code="rdrNUpdt" description="Check for new items"> 
     <cocoa class="rdrNotifierUpdateCommand"/> 
    </command> 
    <class name="application" code="Capp"> 
     <cocoa class="NSApplication"/> 
     <responds-to name="do update"> 
     <!-- Note you need to specify a method here, 
      although it is blank --> 
     <cocoa method=""/> 
     </responds-to> 
    </class> 
    </suite> 
</dictionary> 

cualquier mejora/consejos/críticas siguen siendo bienvenidos.

Respuesta

2

¡Gracias por hacer el esfuerzo de agregar AppleScript a su aplicación! Solo una rápida observación/crítica: al construir terminología, incluya todos los espacios, pero si esa terminología toma la forma de 'verbo sustantivo' (como 'actualizar'), AppleScripters se irritará si el sustantivo 'actualización' no está correctamente definido. objeto modelado, y si 'do' no es un comando apropiado.

Yo diría que 'do' es una mala elección para un nombre de comando, porque es muy vago. ¿Qué pasa con solo usar 'actualizar' como el comando? (es decir, tratarlo como un verbo).

Este tema es tratado en detalle por la propia nota técnica de Apple 2106 (actualmente here), que definitivamente debe leer y digerir si espera complacer a su comunidad de usuarios de AppleScripting.

Apple no están más allá de las estúpidas opciones de terminología como updatePodcast y updateAllPodcasts (en iTunes). Estas son elecciones estúpidas porque (de acuerdo con tn2106) no contienen espacios, y porque la mejor opción sería tener una clase de podcast adecuada y luego tener un comando de actualización que se pueda usar en un podcast individual, todos los podcasts o un determinado canal elegido. conjunto de podcasts.

+0

Muchas gracias por indicarme la nota técnica.Sí, "actualizar" suena tonto; poner "do" (quise decir "realizar", pero usar eso tampoco ayudaría demasiado) no tiene ningún sentido. Cambié el código a un solo verbo y, de hecho, arrojé también "update" y terminé con "refresh". –

+0

¡la actualización suena genial! :) muy refrescante – brennanyoung

+0

No veo cómo esto es ni remotamente una respuesta. – Volomike

Cuestiones relacionadas