2013-05-12 5 views
6

Sto cercando un modo per eseguire un file Applescript da all'interno di un'app per Mac. Ho realizzato precedenti applicazioni mac che usano NSAppleScript *script = [[NSAppleScript alloc] initWithSource: @"MY_CODE"]];, ma il mio applescript è piuttosto lungo e mi piacerebbe solo essere in grado di fare riferimento a quel file come parte del mio progetto, e incanalare il contenuto di esso (o semplicemente eseguire direttamente il file dalla mia app).Esegui il file AppleScript nell'app per Mac?

Grazie!

+0

Cosa otterresti se cercassi "[oggettivo-c] mele" qui? –

risposta

2

Perché non inserire lo script o il testo script compilato nel pacchetto e quindi utilizzare initWithContentsOfURL:error: method di NSAppleScript?

Ad esempio:

NSError * error = NULL; 
NSURL * resourceURL = [[NSBundle mainBundle] resourceURL]; 
NSURL * urlOfScript = [resourceURL URLByAppendingPathComponent: @"MyApplescript.scpt"]; 
NSAppleScript *script = [[NSAppleScript alloc] initWithContentsOfURL: urlOfScript error: &error]; 
if(script == NULL) 
{ 
    NSLog(@"could not instantiate script at %@ - %@", [urlOfScript absolutePath], [error localizedDescription]); 
} 
11

Per eseguire AppleScript forniti dall'utente al di fuori della sandbox (10.8+), utilizzare NSUserAppleScriptTask

Per eseguire file incorporati in bundle dell'applicazione, o script fornite dall'utente .scpt in 10.7 o precedenti, utilizzare NSAppleScript.

NSUserAppleScriptTask e NSAppleScript sono entrambi un po 'noiosi, intendiamoci. Nessuno dei due fornisce la conversione automatica dei dati tra i tipi Cocoa e AS, il che significa molto lavoro manuale con NSAppleEventDescriptors per passare parametri e risultati. Le istanze di NSAppleScript forniscono un supporto di persistenza parziale: le proprietà dello script mantengono lo stato tra più chiamate di gestori, ma non c'è modo di salvare lo script modificato sul disco in modo che eventuali modifiche vengano perse una volta deallocato. E NSUSerAppleScriptTask è un affare strettamente one-shot, quindi lo stato di script non persiste affatto tra una chiamata e l'altra.

per una più profonda integrazione tra il codice AppleScript e objC incorporato all'interno del vostro pacco app, utilizzare AppleScriptObjC (10.6+):

ASOC è un bidirezionale è simile a PyObjC o RubyCocoa, consentendo di scrivere il codice AppleScript all'interno di oggetti script che appaiono al codice ObjC come normali classi Cocoa, consentendo al codice ObjC di chiamare i gestori AS e il codice AS per chiamare i metodi ObjC. I tipi comuni di ObjC e AS (int, doppi, NSString, NSArrays, ecc.) Vengono automaticamente spostati/convertiti quando si attraversa il ponte, quindi non richiede altro lavoro o un cast occasionale sul lato AS.

ASOC non è perfetto (i documenti di Apple fanno schifo, il bridging non è gratuito e glitch non sono sconosciuti), ma per interagire con app scriptable da ObjC è il meglio di un insieme di scelte altrimenti piuttosto spazzatura .

+0

Un modo per passare i parametri? O dobbiamo costruire un nuovo script con argomenti interpolati ogni volta che dobbiamo chiamarlo (parametri di poveri)? –

+0

L'utilità della riga di comando 'osascript' [supporta gli argomenti in modo decente] (http://hints.macworld.com/article.php?story=20050523140439734). Spero che qualcosa di simile sia possibile in Objective-C o Swift. –

+1

Utilizzo di ['NSAppleScript' /' NSUserAppleScriptTask'] (http://appscript.sourceforge.net/nsapplescript.html). Utilizzando ['AppleScriptObjC'] (http://appscript.sourceforge.net/asoc.html). – foo