Ответ 1
-
Если вы хотите отправить AppleScript из своего приложения и вам понадобится изолированное приложение, вам необходимо создать временное право
-
Вам нужно добавить эти два ключа в свой info.plist
<key>NSAppleScriptEnabled</key> <true/> <key>OSAScriptingDefinition</key> <string>MyAppName.sdef</string>
... конечно, вы должны изменить "MyAppName" на свое имя приложения
-
Создайте файл .sdef и добавьте его в свой проект. Дальнейший курс теперь в значительной степени зависит от потребностей вашего приложения:
- Элементы класса (создайте объект из AppleScript)
- Элементы команд (переопределить команды NSScriptCommand и выполнить команды типа "глагол" )
- Элементы перечисления
- Элементы типа записи
- Элементы типа значения (KVC)
- Cocoa Элементы
-
Перейдите сюда, чтобы найти подробное описание и много деталей об их реализации: 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. Надеюсь, это поможет кому-то быстрее разобраться...