Заставить приложение Cocoa реагировать на простую команду AppleScript - PullRequest
6 голосов
/ 14 мая 2011

Я пытаюсь добавить тривиальную поддержку AppleScript в приложение Какао.Приложение периодически выполняет проверку, и я просто хочу, чтобы я мог сказать ему, чтобы она выполнялась по требованию.

Я пытаюсь следовать примеру SimpleScriptingVerbs Apple.

У меня есть подкласс NSScriptCommand следующим образом:

Заголовок:

#import <Cocoa/Cocoa.h>

@interface rdrNotifierUpdateCommand : NSScriptCommand {

}
-(id)performDefaultImplementation;
@end

Реализация:

#import "rdrNotifierUpdateCommand.h"
#import "rdrNotifierAppDelegate.h"

@implementation rdrNotifierUpdateCommand

-(id)performDefaultImplementation {
  NSLog(@"Works at last");
  [((rdrNotifierAppDelegate *)[[NSApplication sharedApplication] delegate])
   checkForNewItems];  // This just fires the timer
  return nil;
}
@end

Мой .sdef файл выглядит следующим образом (и проблема кажетсячтобы быть там, но я не могу его найти):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude">
    <xi:include href="file:///System/Library/ScriptingDefinitions/CocoaStandard.sdef" xpointer="xpointer(/dictionary/suite)"/>
    <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities.">
        <command name="do update" code="rdrNUpdt" description="Check for new items">
            <cocoa class="rdrNotifierUpdateCommand"/>
        </command>
    </suite>
</dictionary>

Info.plist настроен соответствующим образом.

Но, когда я пытаюсь запустить следующий скрипт в редакторе AppleScript:

tell application "rdrNotifier"
    do update
end tell

Я получаю сообщение об ошибке, что переменная "update" не определена.

Я могу открыть словарь для моего приложения из редактора AppleScript (т.е. он успешно зарегистрирован).

Редактировать: Найдено решение

Проблема действительно была в файле sdef: я не указывал, что приложение может ответить на команду.Мое окончательное определение выглядит следующим образом (код Obj-C без изменений):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="Dictionary" xmlns:xi="http://www.w3.org/2003/XInclude">
  <!-- I have removed the standard suite as the application does not open, print... -->
  <suite name="rdrNotifier Suite" code="rdrN" description="rdrNotifier application specific scripting facilities.">
    <command name="do update" code="rdrNUpdt" description="Check for new items">
      <cocoa class="rdrNotifierUpdateCommand"/>
    </command>
    <class name="application" code="Capp">
      <cocoa class="NSApplication"/>
      <responds-to name="do update">
        <!-- Note you need to specify a method here,
             although it is blank -->
        <cocoa method=""/>
      </responds-to>
    </class>
  </suite>
</dictionary>

Любые улучшения / советы / критика по-прежнему приветствуются.

1 Ответ

2 голосов
/ 30 мая 2011

Спасибо за то, что приложили усилия для добавления поддержки applecript в свое приложение! Просто быстрое наблюдение / критика: при построении терминологии обязательно включайте пробелы, но если эта терминология принимает форму «глагола существительного» (например, «do update»), appleScripters будет раздражен, если существительное «update» не является надлежащим образом моделируемый объект, и если «do» не является правильной командой.

Я бы сказал, что «do» - плохой выбор для имени команды, потому что оно очень расплывчато. Что не так с использованием «update» в качестве команды? (то есть относиться к нему как к глаголу).

Эта проблема подробно рассматривается в собственном техническом замечании Apple 2106 (в настоящее время здесь ), которое вам обязательно нужно прочитать и переварить, если вы хотите порадовать свое сообщество пользователей AppleScripting.

Сами Apple не выходят за рамки глупой терминологии, такой как updatePodcast и updateAllPodcasts (в iTunes). Это глупый выбор, потому что (согласно tn2106) они не содержат пробелов, и потому что лучшим выбором будет иметь соответствующий класс подкаста, а затем команду обновления, которая может использоваться на отдельном подкасте, на всех подкастах или на конкретном выбранном набор подкастов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...