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

Другие вопросы по тегам