Run AppleScript from Cocoa Application

匿名 (未验证) 提交于 2019-12-03 08:33:39

问题:

Is it possible to run an AppleScript code inside an Cocoa Application?

I've tried NSAppleScript class, but no success.

Also, does Apple allow this?

回答1:

You mentioned xcode wasn't saving the script to your app's resources path. That is correct. You have to tell xcode to do this. First add the compiled script to your project. Then open your target and find the "Copy Bundle Resources" action. Drag your script from the files list into that action. This way your script is copied to your app's resources automatically so you don't have to do it by hand.

Whenever I use a compiled AppleScript in a cocoa application I, 1) add the script to the project, 2) create a new class to control the AppleScript, 3) use the below init method for the class, and 4) drag the script to the "Copy Bundle Resources" action of the target.

- (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:

Solved!

XCode wasn't saving my script file into app's resources path. To run an AppleScript code from Cocoa Application, use this:

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]; 


回答3:

From Apple Documentation 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     } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!