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.
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". –
¡la actualización suena genial! :) muy refrescante – brennanyoung
No veo cómo esto es ni remotamente una respuesta. – Volomike