Applescript: дилемма Tell by Variable

Я хотел бы сделать это:

tell application "Finder" to set appName to (application file id "com.google.Chrome") as text
using terms from application appName
    tell application appName to get URL of active tab of first window
end using terms from

Это не работает, потому что для «использования терминов из» требуется имя приложения в виде строковой константы. Если я заменю эту строку:

using terms from application appName

с этим

using terms from application "Google Chrome"

оно работает. Однако я не хочу полагаться на целевую машину с приложением под названием «Google Chrome». Использование идентификаторов пакетов кажется более безопасным. Есть лучший способ это сделать?

Редактировать

Следуя совету @regulus6633, я попробовал следующее:

NSAppleScript* script = [[NSAppleScript alloc] initWithSource:
    @"tell application \"Finder\" to set appName to (application file id \"com.google.Chrome\") as text"
    @"\nusing terms from application \"Google Chrome\""
    @"\ntell application appName to get URL of active tab of first window"
    @"\nend using terms from"];

Это отлично работает, но если я запускаю то же (скомпилированное) приложение на другом компьютере, где «Google Chrome» переименован в «Chrome», я получаю всплывающее диалоговое окно с вопросом, где находится «Google Chrome». Кажется, что NSApleScript компилируется во время выполнения?


person David    schedule 05.01.2011    source источник


Ответы (1)


Вы неправильно понимаете, что делает «использование терминов из». Это способ компилировать скрипт на вашем компьютере с помощью приложения, а затем не перекомпилировать скрипт на компьютере пользователя. Другими словами, когда вы компилируете эту строку кода на своем компьютере, эта строка кода ничего не делает на компьютере пользователя, и, таким образом, пользователю не нужно приложение, которое вы использовали для компиляции скрипта... так что эта строка именно то, что вы ищете. Обязательно сохраните свой сценарий как «приложение», чтобы его не нужно было перекомпилировать на компьютере пользователя.

Вот как вы на самом деле хотите, чтобы ваш код выглядел так:

-- here you determine what the user's browser is
set usersBrowser to "whatever"

using terms from application "Google Chrome"
    tell application usersBrowser
        -- here you do something in the user's browser
        -- you have to make sure that whatever command you use is applicable to both google chrome and whatever browser the user is using i.e. the command must work in both browsers
    end tell
end using terms from
person regulus6633    schedule 06.01.2011
comment
У меня это реализовано как NSAplescript в приложении какао. Будет ли он скомпилирован с пакетом приложений? - person David; 06.01.2011
comment
NSApplescript компилирует прочитанный в него код. Поэтому, если вы хотите использовать переменный код AppleScript в вашей программе Objective-C, лучше всего будет создать AppleScript на лету в вашем коде Objective-C. Затем используйте NSAplescript для компиляции этого кода, который затем должен быть правильным для ситуации каждого пользователя. Вы создаете NSString, содержащую строки кода applescript, используя \n между строками, а затем используете initWithSource: метод NSApplescript для создания applescript. - person regulus6633; 06.01.2011
comment
Я пытался это сделать, но это не сработало после того, как приложение было переименовано. Я обновил свой вопрос тем, что я сделал. - person David; 09.01.2011
comment
Найдите код для определения браузера пользователя по умолчанию. Используйте это, прежде чем создавать код AppleScript. Затем, когда вы знаете имя браузера, вы создаете NSString... но не используете термины from. Нет причин делать это. Просто используйте приложение tell вместе с именем браузера по умолчанию, которое вы определили ранее. - person regulus6633; 09.01.2011
comment
Проблема в том, что мне нужно работать с несколькими браузерами, а не только с браузером пользователя по умолчанию. В итоге я скомпилировал applescript и сохранил его в пакете приложений, а затем использовал метод NSAppleScript initWithContentsOfURL для выполнения сценариев. Я надеялся сохранить весь исходный код внутри, но не могу найти другого способа. - person David; 10.01.2011