интеграция яблочного сценария в какао - PullRequest
0 голосов
/ 16 июня 2009

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

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

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

UPDATE: Письмо создано. Яблочный скрипт, похоже, останавливается, когда добавляется вложение. Любая подсказка?

Спасибо

Ответы [ 5 ]

5 голосов
/ 16 июня 2009

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

NSDictionary *dict = nil;
if ([mailScript executeAndReturnError: &dict] == nil)
{
  //ooh, it went wrong, look at dict
}
else
{
  // well, that worked!
}
1 голос
/ 16 июня 2009

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

osascript -e 'applescript here';
1 голос
/ 16 июня 2009

Ваш код выглядит хорошо. Вероятно, в вашем 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 выведет на консоль строку, описывающую любые ошибки. Это должно помочь вам найти какие-либо проблемы.

0 голосов
/ 16 апреля 2018

извините, уже поздно отвечать. Applescript в приложении какао может быть легко использован с некоторыми базовыми принципами, сначала установите все дескрипторы на «NULL», используйте «NSAppleEventDescriptor» для правильного выполнения скрипта и используйте возвращаемое значение executen, которое даст ваш скрипт:

NSString * scriptString = NULL, NSString * retvalue = NULL;

NSAppleEventDescriptor * descriptor = NULL;

NSDictionary * errInfo = nil;

NSAppleScript * mailScript = NULL;

scriptString = [NSString stringWithFormat: @ "the applescript"];

mailScript = [[NSAppleScript alloc] initWithSource: scriptString];

descriptor = [mailScript executeAndReturnError: & errInfo];

retvalue = [descriptor stringValue];

[mailScript release];   

Для "яблочного сценария" вы не написали, чего хотите добиться, я думаю, это для конфиденциальности.

0 голосов
/ 16 июня 2009

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

Согласно @ cocoadevcentral :

SBApplication: используется для выполнения вызовов сценариев между приложениями с Objective-C вместо AppleScript. Пример: получить текущий трек iTunes.

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

Класс SBApplication предоставляет механизм, позволяющий программе Objective-C отправлять события Apple в приложение с поддержкой сценариев и получать события Apple в ответ. Это позволяет этой программе управлять приложением и обмениваться данными с ним. Мост сценариев работает путем соединения типов данных между дескрипторами событий Apple и объектами Какао.

Хотя SBApplication включает методы, которые вручную отправляют и обрабатывают события Apple, вам никогда не придется вызывать эти методы напрямую. Вместо этого подклассы SBApplication реализуют специфичные для приложения методы, которые автоматически обрабатывают отправку событий Apple.

Например, если вы хотите получить текущий трек iTunes, вы можете просто использовать метод currentTrack динамически определенного подкласса для приложения iTunes, который обрабатывает детали отправки события Apple для вас, вместо того, чтобы вычислять более сложная альтернатива низкого уровня:

[iTunes propertyWithCode:'pTrk'];

Если вам нужно отправлять события Apple вручную, рассмотрите возможность использования класса NSAppleEventDescriptor.

Надеюсь, это поможет!

...