2010-03-19 21 views
31

Ich bin neu in der Welt der Cocoa-Programmierung, und ich möchte Applescript-Unterstützung zu meiner Anwendung hinzufügen. Die Beispiele auf der Apple-Website scheinen veraltet zu sein.Wie füge ich meiner Cocoa-Anwendung Applescript-Unterstützung hinzu?

Wie füge ich meiner Cocoa-Anwendung Applescript-Unterstützung hinzu?

+0

Es ist nicht klar, ob diese Frage ist eine App skript oder Aufrufen Skripts von einer App über die Herstellung . –

Antwort

4

Moderne Versionen von Cocoa können die Eigenschaftsliste für die Skriptdefinition (.sdef) direkt interpretieren. Daher müssen Sie für die grundlegende AppleScript-Unterstützung nur den sdef-Code für die Dokumente erstellen und ihn der Phase "Bundle-Ressourcen hinzufügen" hinzufügen und erklären Sie AppleScript-Unterstützung in Ihrer Info.plist. Um auf andere Objekte als NSApp zuzugreifen, definieren Sie Objektspezifizierer, sodass jedes Objekt seine Position in der Hierarchie der Scripting-Welt kennt. Dadurch können Sie Objekteigenschaften kvc manipulieren und Objektmethoden als einfache Skriptbefehle verwenden.

+3

Sdef Editor kann helfen. http://www.shadowlab.org/Software/sdefeditor.php –

+0

"Um auf andere Objekte als NSApp zuzugreifen, definieren Sie Objektbezeichner" - wo wird dies dokumentiert? Können Sie bitte einen direkten Link angeben? – hendrik

+0

Arbeitslink für Sdef Editor: https://www.shadowlab.org/softwares/sdefeditor.php – doekman

41
  1. Wenn Sie Apple aus Ihrer Anwendung senden möchten und brauchen eine Sandbox-App, müssen Sie eine temporäre Berechtigung erstellen

  2. Sie müssen diese zwei Schlüssel in Ihrem info.plist hinzufügen

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

... natürlich müssen Sie "MyAppName" ändern, um App-Name

  1. Erstellen Sie eine .sdef-Datei und fügen Sie sie Ihrem Projekt hinzu. Der weitere Verlauf hängt nun stark von den Anforderungen Ihrer Anwendung gibt es:

    1. Klasse Elemente
    2. Befehl Elemente (außer Kraft setzen NSScriptCommand und „Verb-like“ Befehle ausführen) (ein Objekt aus Applescript erstellen)
    3. Aufzählungselemente
    4. Aufzeichnungs Typ Elements
    5. Wert Typ Elements (KVC)
    6. Cocoa Elemente

    -

    hier geht eine detaillierte Beschreibung und viele Details über deren Umsetzung zu finden: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_script_cmds/SAppsScriptCmds.html

  2. ich mit Klasse und KVC Elemente sehr kompliziert Ergebnis arbeiten, wie ich mit einem einzigen Befehl nur ausführen wollte, nichts Außergewöhnliches. Um anderen zu helfen, hier ein Beispiel, wie man einen neuen einfachen Befehl mit einem Argument erstellt. In diesem Beispiel werde es „Nachschlag“ eine Zeichenfolge wie folgt:

    tell application "MyAppName" 
        lookup "some string" 
    end tell 
    
  3. Die .sdef Datei für diesen Befehl sieht wie folgt aus:

    <?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. eine Unterklasse von NSScriptCommand Erstellen und benennen Sie es MyLookupCommand

    Der MyLookupCommand.h

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

    Die 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 
    

    Das ist es im Grunde. Das Geheimnis dazu ist die Unterklasse NSScriptCommand und überschreiben performDefaultImplementation. Ich hoffe, das jemand hilft es, schneller zu bekommen ...

+2

Danke dafür. Einfach hinzufügen. Wenn Sie dies zum ersten Mal einrichten und danach Änderungen vornehmen. Sie müssen die App erneut ausführen und erstellen. Nicht nur bauen. Beenden und starten Sie Applescript Editor erneut, um den Cache zu löschen. Ich habe das auf die harte Tour durch Versuch und Irrtum herausgefunden. Aber später, als ich die Dokumente gelesen habe (Teil davon jedenfalls), wurde bestätigt, dass dies getan werden musste :-) – markhunte

+1

Beste Skriptergebnis aller Zeiten. Vielen Dank. – mohacs

+0

Der direkte Parameter sollte nicht so erhalten werden. Sie können einfach 'self.directParameter' in Ihrer' NSScriptCommand'-Unterklasse verwenden. –

1

Ein einfaches Beispiel für den Einstieg,

Ort ein Skript (namens Dialog) in den Dokumentenordner, dann können Sie es von Xcode laufen

Das schöne daran, das Skript extern zu halten, ist die Möglichkeit, es außerhalb von Xcode zu bearbeiten. Ich würde empfehlen, die Fehler Hinzufügen zu überprüfen, ob Sie als Applescript Bearbeitung gestartet wurde

mit nicht

überprüfen vielleicht kompilieren kann

if(scriptObject.isCompiled){ 
Verwandte Themen