Подтвердить что ты не робот

Как добавить поддержку Applescript в мое приложение Cocoa?

Я новичок в мире программирования Cocoa, и я хочу добавить поддержку Applescript в свое приложение. Примеры на веб-сайте Apple выглядят устаревшими.

Как добавить поддержку Applescript в мое приложение Cocoa?

4b9b3361

Ответ 1

  • Если вы хотите отправить AppleScript из своего приложения и вам понадобится изолированное приложение, вам необходимо создать временное право

  • Вам нужно добавить эти два ключа в свой info.plist

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

... конечно, вы должны изменить "MyAppName" на свое имя приложения

  1. Создайте файл .sdef и добавьте его в свой проект. Дальнейший курс теперь в значительной степени зависит от потребностей вашего приложения:

    • Элементы класса (создайте объект из AppleScript)
    • Элементы команд (переопределить команды NSScriptCommand и выполнить команды типа "глагол" )
    • Элементы перечисления
    • Элементы типа записи
    • Элементы типа значения (KVC)
    • Cocoa Элементы

    -

    Перейдите сюда, чтобы найти подробное описание и много деталей об их реализации: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_script_cmds/SAppsScriptCmds.html

  2. Я нашел работу с Class и KVC Elements очень сложной, так как я просто хотел выполнить одну команду, ничего необычного. Итак, чтобы помочь другим, вот пример того, как создать новую простую команду с одним аргументом. В этом примере он будет "искать" одну строку следующим образом:

    tell application "MyAppName"
        lookup "some string"
    end tell
    
  3. Файл .sdef для этой команды выглядит следующим образом:

    <?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. Создайте подкласс NSScriptCommand и назовите его MyLookupCommand

    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
    

    Это в основном это. Секрет этого заключается в подклассе NSScriptCommand и переопределении функции выполненияDefaultImplementation. Надеюсь, это поможет кому-то быстрее разобраться...

Ответ 2

Современные версии Cocoa могут напрямую интерпретировать список свойств определения сценариев (.sdef), поэтому все, что вам нужно сделать для базовой поддержки AppleScript, - это создать sdef для документов, добавить его в свои ресурсы "Ресурсы копий", фазу и объявить поддержку AppleScript в вашем Info.plist. Для доступа к объектам, отличным от NSApp, вы определяете спецификаторы объектов, поэтому каждый объект знает свою позицию в иерархии мира скриптов. Это дает вам kvc-манипулирование свойствами объекта и возможность использовать объектные методы как простые команды script.

Ответ 3

Простой пример, чтобы вы начали,

поместите script (named dialog) в папку документов, затем вы можете запустить его из 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];

Хорошая вещь о сохранении script external - возможность редактировать его вне Xcode. Я бы рекомендовал добавить проверку ошибок, если вы начали редактирование, поскольку applescript не может компилировать

возможно, проверьте с помощью

if(scriptObject.isCompiled){