Запустить AppleScript из приложения Cocoa
Возможно ли запустить код AppleScript внутри приложения Cocoa?
Я пробовал class NSAppleScript, но не добился успеха.
Кроме того, разрешает ли Apple это?
- Глобальная переменная int c
- Убедитесь, что адрес электронной почты действителен для iOS
- Можно ли использовать Swift's Enum в Obj-C?
- objective-C: декларация о перекрестном classе
- Как использовать тот же код на C ++ для Android и iOS?
- Запуск приложения Mac с Objective-C / Cocoa
- Почему переменная NSInteger должна быть отброшена дольше при использовании в качестве аргумента формата?
- Как преобразовать NSInteger в int?
- NSInvocation для чайников?
- NSString tokenize в Objective-C
- Смешивание Objective-C и C ++
- Как называется эта форма определения?
- Как я могу подключить iPhone и веб-службу и получить данные XML?
Вы упомянули, что xcode не сохраняет скрипт на пути ресурсов вашего приложения. Это верно. Вы должны сказать xcode, чтобы сделать это. Сначала добавьте скомпилированный скрипт в свой проект. Затем откройте свою цель и найдите действие «Copy Bundle Resources». Перетащите свой скрипт из списка файлов в это действие. Таким образом, ваш скрипт автоматически копируется на ресурсы вашего приложения, поэтому вам не нужно делать это вручную.
Всякий раз, когда я использую скомпилированный AppleScript в приложении для cocoa, я добавляю сценарий к проекту, 2) создаю новый class для управления AppleScript, 3) используем ниже описанный метод init для classа и 4) перетаскиваем скрипт на действие «Копировать ресурсы Bundle» цели.
- (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; }
Решено!
XCode не сохранял мой файл сценария в пути ресурсов приложения. Чтобы запустить код AppleScript из приложения Cocoa, используйте следующее:
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];
Из документации 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 } }