Запустите AppleScript из приложения Какао - PullRequest
12 голосов
/ 06 февраля 2011

Можно ли запустить код AppleScript внутри приложения Какао?

Я пробовал класс NSAppleScript, но безуспешно.

Кроме того, Apple разрешает это?

Ответы [ 3 ]

12 голосов
/ 06 февраля 2011

Решено!

XCode не сохранял мой файл скрипта в пути к ресурсам приложения.Чтобы запустить код AppleScript из приложения какао, используйте это:

NSString* path = [[NSBundle mainBundle] pathForResource:@"ScriptName" ofType:@"scpt"];
NSURL* url = [NSURL fileURLWithPath:path];NSDictionary* errors = [NSDictionary dictionary];
NSAppleScript* appleScript = [[NSAppleScript alloc] initWithContentsOfURL:url error:&errors];
[appleScript executeAndReturnError:nil];
[appleScript release];
11 голосов
/ 06 февраля 2011

Вы упомянули, что xcode не сохранял скрипт в пути к ресурсам вашего приложения. Это правильно. Вы должны сказать xcode, чтобы сделать это. Сначала добавьте скомпилированный скрипт в ваш проект. Затем откройте свою цель и найдите действие «Копировать ресурсы комплекта». Перетащите ваш скрипт из списка файлов в это действие. Таким образом, ваш скрипт автоматически копируется в ресурсы вашего приложения, поэтому вам не нужно делать это вручную.

Всякий раз, когда я использую скомпилированный AppleScript в приложении какао, я: 1) добавляю сценарий в проект, 2) создаю новый класс для управления AppleScript, 3) использую метод init для класса ниже и 4) перетаскиваю сценарий для действия «Копировать набор ресурсов» цели.

- (id)init {
    NSURL *scriptURL = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"applescripts" ofType:@"scpt"]];
    if ([self initWithURLToCompiledScript:scriptURL] != nil) { //attempt to load the script file
    }

    return self;
}
2 голосов
/ 27 февраля 2015

Из документации Apple https://developer.apple.com/library/mac/technotes/tn2084/_index.html

- (IBAction)addLoginItem:(id)sender
{
    NSDictionary* errorDict;
    NSAppleEventDescriptor* returnDescriptor = NULL;

    NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:
                @"\
                set app_path to path to me\n\
                tell application \"System Events\"\n\
                if \"AddLoginItem\" is not in (name of every login item) then\n\
                make login item at end with properties {hidden:false, path:app_path}\n\
                end if\n\
                end tell"];

    returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
    [scriptObject release];

    if (returnDescriptor != NULL)
    {
        // successful execution
        if (kAENullEvent != [returnDescriptor descriptorType])
        {
            // script returned an AppleScript result
            if (cAEList == [returnDescriptor descriptorType])
            {
                 // result is a list of other descriptors
            }
            else
            {
                // coerce the result to the appropriate ObjC type
            }
        } 
    }
    else
    {
        // no script result, handle error here
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...