2009-06-16 2 views
0

Я сделал короткий applescript, который отправляет электронное письмо с приложением. Теперь я хочу интегрировать этот скрипт в свое приложение для какао. Я пробовал следующий код, который я нашел в Интернете:интеграция applescript в какао

NSAppleScript *mailScript; 
NSString *scriptString= [NSString stringWithFormat:@"the applescript"]; 
mailScript = [[NSAppleScript alloc] initWithSource:scriptString]; 
[mailScript executeAndReturnError:nil]; 
[mailScript release]; 

Этот код не работает. Я полный новичок в какао и могу использовать некоторую помощь.

ОБНОВЛЕНИЕ: Электронная почта создается. Яблоко, кажется, останавливается, когда добавлено приложение. Прикладное искусство отлично работает при запуске в сценаристе. Любая подсказка?

Thanks

+1

FYI: У Adium возникли проблемы с утечкой памяти NSAppleScript. Вы можете попробовать OSAScript из среды OSAKit. Рамка поставляется с Mac OS X, и API почти точно такой же. –

ответ

1

Ваш код выглядит нормально. Вероятно, в вашем AppleScript есть ошибка.

Попробуйте следующее:

NSAppleScript *mailScript; 
NSAppleEventDescriptor *resultDescriptor; 
NSString *scriptString= [NSString stringWithFormat:@"the applescript"]; 
mailScript = [[NSAppleScript alloc] initWithSource:scriptString]; 
resultDescriptor = [mailScript executeAndReturnError:nil]; 
NSLog([resultDescriptor stringValue]); 
[mailScript release]; 

NSLog будет выводить строку с описанием ошибки в консоли. Это должно помочь вам найти какие-либо проблемы.

+1

- [NSAppleScript executeAndReturnError:] документируется, чтобы возвращать нуль при возникновении ошибки. – 2009-06-16 18:57:28

+0

Хорошая точка ... это то, что я получаю от мысли. ;) Ваш ответ больше похож на то, что я * должен * сказать, так +1. – Naaff

5

Итак, когда вы не игнорируете ошибку от -[NSAppleScript executeAndReturnError:], какова ошибка? Расскажите, пожалуйста, что-нибудь о том, что пошло не так?

NSDictionary *dict = nil; 
if ([mailScript executeAndReturnError: &dict] == nil) 
{ 
    //ooh, it went wrong, look at dict 
} 
else 
{ 
    // well, that worked! 
} 
1

Если требуется время, чтобы добраться до нужного места в вашем приложении, и вы просто хотите проверить Applescript, вы можете запустить его из терминала с помощью команды osascript и увидеть результаты:

osascript -e 'applescript here'; 
0

Кажется, SBApplication должен работать, но я не использовал его раньше.

По @cocoadevcentral:

SBApplication: use to make cross-application scripting calls with Objective-C instead of AppleScript. Ex: get current iTunes track.

Вот это выдержка из документации:

The SBApplication class provides a mechanism enabling an Objective-C program to send Apple events to a scriptable application and receive Apple events in response. It thereby makes it possible for that program to control the application and exchange data with it. Scripting Bridge works by bridging data types between Apple event descriptors and Cocoa objects.

Although SBApplication includes methods that manually send and process Apple events, you should never have to call these methods directly. Instead, subclasses of SBApplication implement application-specific methods that handle the sending of Apple events automatically.

For example, if you wanted to get the current iTunes track, you can simply use the currentTrack method of the dynamically defined subclass for the iTunes application—which handles the details of sending the Apple event for you—rather than figuring out the more complicated, low-level alternative:

[iTunes propertyWithCode:'pTrk']; 

If you do need to send Apple events manually, consider using the NSAppleEventDescriptor class.

Надежда, что помогает!

Смежные вопросы