Я новичок в мире программирования Cocoa, и я хочу добавить поддержку Applescript в свое приложение. Примеры на веб-сайте Apple выглядят устаревшими.
Как добавить поддержку Applescript в мое приложение Cocoa?
Я новичок в мире программирования Cocoa, и я хочу добавить поддержку Applescript в свое приложение. Примеры на веб-сайте Apple выглядят устаревшими.
Как добавить поддержку Applescript в мое приложение Cocoa?
Если вы хотите отправить AppleScript из своего приложения и вам понадобится изолированное приложение, вам необходимо создать временное право
Вам нужно добавить эти два ключа в свой info.plist
<key>NSAppleScriptEnabled</key>
<true/>
<key>OSAScriptingDefinition</key>
<string>MyAppName.sdef</string>
... конечно, вы должны изменить "MyAppName" на свое имя приложения
Создайте файл .sdef и добавьте его в свой проект. Дальнейший курс теперь в значительной степени зависит от потребностей вашего приложения:
-
Перейдите сюда, чтобы найти подробное описание и много деталей об их реализации: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ScriptableCocoaApplications/SApps_script_cmds/SAppsScriptCmds.html
Я нашел работу с Class и KVC Elements очень сложной, так как я просто хотел выполнить одну команду, ничего необычного. Итак, чтобы помочь другим, вот пример того, как создать новую простую команду с одним аргументом. В этом примере он будет "искать" одну строку следующим образом:
tell application "MyAppName"
lookup "some string"
end tell
Файл .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>
Создайте подкласс 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. Надеюсь, это поможет кому-то быстрее разобраться...
Современные версии Cocoa могут напрямую интерпретировать список свойств определения сценариев (.sdef), поэтому все, что вам нужно сделать для базовой поддержки AppleScript, - это создать sdef для документов, добавить его в свои ресурсы "Ресурсы копий", фазу и объявить поддержку AppleScript в вашем Info.plist. Для доступа к объектам, отличным от NSApp, вы определяете спецификаторы объектов, поэтому каждый объект знает свою позицию в иерархии мира скриптов. Это дает вам kvc-манипулирование свойствами объекта и возможность использовать объектные методы как простые команды script.
Простой пример, чтобы вы начали,
поместите 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){