NSAppleEventDescriptor вернулся из проблем развертывания моста сценариев
Я работаю на OSX, Xcode 8.2. Objective-C. Я использую скриптовый мост для обращения к Adobe InDesign. У меня довольно длинный AppleScript, который я хочу перевести на Objective-C с помощью Scripting-Bridge, чтобы воспользоваться его возможностями фоновых задач.
Для лучшего понимания позвольте мне показать вам часть из applecript:
tell application "Adobe InDesign CC 2017"
tell active document
-- grep setup done before
find grep
end tell
end tell
Результат в appleScriptcript:
{
text from character 294 to character 298 of story id 1354 of document id 5 of application "Adobe InDesign CC 2017",
text from character 140 to character 144 of story id 1377 of document id 5 of application "Adobe InDesign CC 2017"
}
Если я хочу получить строку в applecript, я выполняю (обратите внимание на "как строку"):
text from character 294 to character 298 of story id 1354 of document id 5 of
application "Adobe InDesign CC 2017" as string
--> "Test1"
Переведенный метод в target-c:
// document is an instance of the SBApplication indesign
[document findGrepReverseOrder:NO];
Результат гласит:
(
"<AdobeInDesignCC2017TextCtxt @0x608020a442f0: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':294, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1354, 'want':'cflo' }, 'seld':298, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1354 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>",
"<AdobeInDesignCC2017TextCtxt @0x608020a44140: AdobeInDesignCC2017TextCtxt [<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':140, 'want':'cha ' }>..<NSAppleEventDescriptor: 'obj '{ 'form':'indx', 'from':'obj '{ 'form':'ID ', 'from':'obj '{ 'form':'ID ', 'from':null(), 'seld':5, 'want':'docu' }, 'seld':1377, 'want':'cflo' }, 'seld':144, 'want':'cha ' }>] of AdobeInDesignCC2017Story id 1377 of AdobeInDesignCC2017Document id 5 of application \"Adobe InDesign CC 2017\" (696)>"
)
Похоже, что каждый объект AdobeInDesignCC2017TextCtxt содержит два дескриптора appleevent для обозначения положения слова и длины. Мне нужно получить к ним доступ, чтобы извлечь информацию. Я проверил ч. файл, но не может найти метод для извлечения текста, как в AppleScript с "как строка". Как я могу получить доступ к дескрипторам? Любая идея приветствуется.
1 ответ
Я бы рекомендовал использовать мост AppleScript-ObjC, который позволяет вызывать обработчики AppleScript непосредственно из ObjC так же, как вы вызываете методы Cocoa. Мост сценариев пронизан искалеченными и отсутствующими функциями и очень подвержен несовместимости приложений, особенно с более старыми приложениями на основе углерода, такими как Adobe. Это работает до определенного момента, и тогда вы облажались. (Я знаю одного парня, который пытался преобразовать все свои сценарии Adobe в SB, но внезапно перестал работать над незначительным обновлением).
Единственная компетентная альтернатива AppleScript - это py-appscript/SwiftAutomation (я использую py3-appscript для высокопроизводительной автоматизации иллюстраций), но я больше не предоставляю публичную поддержку для тех из-за провала Apple, так что вы будете сами по себе. AppleScript - ужасный язык, но по крайней мере он официально поддерживается [кашель], и его мост событий Apple не имеет себе равных. Вот краткое руководство по вызову AS из ObjC. Пока вы вызываете свои обработчики AppleScript в одном потоке, части ObjC вашей программы могут использовать потоки, GCD и т. Д. Это действительно просто, почти полностью безболезненно и позволяет каждому языку делать то, что у него получается лучше всего.