@ vadian: Никогда не генерируйте код из произвольных строк. И код OP, и ваше упрощение его принципиально небезопасны и не должны использоваться.
The правильный способ передачи произвольных аргументов в NSAppleScript
состоит в создании NSAppleEventDescriptor
, содержащем имя вызываемого обработчика и передаваемые ему данные, а затем вызовите -executeAppleEvent:error:
для вызова этого обработчика.
Тем не менее, использование NSAppleScript
является смехотворно утомительным , и гораздо проще вызывать обработчики AppleScript напрямую через мост AppleScript-ObjC.
Вот пример кода для LoginItems.applescript
:
use framework "Foundation"
script LoginItems
property parent: script "NSObject"
to addLoginItem(appName, appPath)
tell application "System Events"
if exists login item appName then delete login item appName
make new login item at end of login items ¬
with properties {name:appName, path:appPath, hidden:false}
end tell
end addLoginItem
end script
В нем отсутствуют такие тонкости, как сообщения об ошибках, но вам следует начать.А вот соответствующий протокол Swift:
@objc(NSObject) protocol LoginItems {
func addLoginItem(_ appName: String, _ appPath: String)
}
Вам нужно будет добавить несколько дополнительных строк шаблона к вашему AppDelegate
, чтобы загрузить скрипт и создать экземпляр класса (см. Swift-Пример проекта AppleScriptObjC по ссылке выше).
О, а также не забудьте добавить строку NSAppleEventUsageDescription
в ваш Info.plist, который необходим вашему приложению для отправки событий Apple другим процессам 10.14 +.