Если SB не использует сообщения Objective- C, что означают документы, когда «подклассы SBApplication реализуют специфичные для приложения c методы, которые автоматически обрабатывают отправку событий Apple»? Почему iTunes RespondsToSelector: @ "playpause" работает, т.е. возвращает true? А как работает [iTunes playpause]? Et c, et c ..
Это работает, потому что самая первая вещь, которую вы делаете в приложении-мосте сценариев, генерирует заголовок. В Catalina это делается следующим образом:
sdp -f h --basename iTunes /System/Applications/Music.app/Contents/Resources/com.apple.Music.sdef
Это читает словарь iTunes (sdef
) и генерирует заголовок для группы аналогичных классов Objective- C. Теперь у вас есть файл iTunes.h , который вы включаете в проект приложения и импортируете в свой код. Он содержит следующую строку:
- (void) playpause; // toggle the playing/paused state of the current track
Итак, теперь playpause
явно объявлен как допустимая команда, которую вы можете отправить объекту iTunesApplication. Затем, когда вы действительно запускаете свое приложение, вы говорите
iTunesApplication* tunes = (iTunesApplication*)[SBApplication applicationWithBundleIdentifier:@"com.apple.music"];
. Это заставляет ваше приложение взаимодействовать с iTunes (Musi c) и снова получать словарь (sdef
) , генерируя реализацию для методов, объявленных в заголовке. Реализация команды playpause
точно такая, как в sdef
, а именно: отправить событие hookPlPs
в iTunes.
Это объясняет, почему вам разрешено скажем playpause
и что происходит , когда вы это говорите.
Это то, что AppleScript есть - это приложение, предоставляющее список вещей, которые вы можете сказать к нему, используя события Apple, вместе с sh -подобными английскими терминами, которые ссылаются на эти события Apple.
Итак, если вы хотите написать мост, вы должны сделать то же самое: вам необходимо предоставить способ прочесывать ресурс sdef
целевого приложения и преобразовывать эту информацию в способ, позволяющий давать соответствующие команды на вашем языке, каким бы он ни был.