Создание сценариев для приложений SwiftUI с помощью AppleScript и Javascript JXA
Обратите внимание, что я внимательно следил за тем, как реализовать поддержку AppleScript в приложении Swift MacOS , однако это не работает для меня. Я предполагаю, что он устарел.
После изучения множества документации, руководств, примеров я застрял, пытаясь заставить поддержку AppleScript/Javascript работать в приложении SwiftUI. (в Macos Big Sur, для начала.)
Основная проблема заключается в том, что вся документация, примеры и т. д. устарели.
Я мог бы задать этот вопрос как о Swift 5 +AppDelegate
вместо SwiftUI, и я был бы в том же рассоле.
Итак, вот что у меня пока...
- Info.plist — (отсутствует в SwiftUI) добавлено:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSAppleScriptEnabled</key>
<true/>
<key>OSAScriptingDefinition</key>
<string>Progression.sdef</string>
</dict>
</plist>
- Progression.entitlements для разрешения сценариев. (Песочница тоже отключена.)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<false/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.automation.apple-events</key>
<true/>
</dict>
</plist>
- Затем я создал то, что, как я надеюсь, работает
Progression.sdef
файл определения сценария.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="Progression Terminology">
<suite name="Progression Suite" code="PrgN" description="Progression scripting classes and commands.">
<command name="progress" code="proGress">
<cocoa class="Progression.ProgressCommand"/>
</command>
</suite>
</dictionary>
-
ProgressCommand
в приложении SwiftUI.
import Foundation
@objc class ProgressCommand: NSScriptCommand {
@objc override func performDefaultImplementation() -> Any? {
print("Called")
return nil
}
}
- Я могу загрузить приложение и обнаружить sdef в ScriptEditor > Open Dictionary...
- В AppleScript я могу вызвать quit в приложении (хотя я не проверял, работает ли это, если я вытащу все элементы сценария):
tell application "Progression"
quit
end tell
- В AppleScript, если я позвоню
progress
кажется, он распознает команду, хотя я не уверен, проходит ли она мимо.sdef
уровень ... потому что он терпит неудачу с:
tell application "Progression"
progress
end tell
error "Progression got an error: Can’t continue progress." number -1708
На данный момент я застрял на пару дней.
Изменить: я нашел этот ответ:
/questions/34385856/sozdanie-prilozheniya-kakao-scriptable-swift/34385860#34385860 , хотя добавление кода в приложение SwiftUI не работает.
К счастью, есть проект и код (использующий старый стиль NSAppDelegate), который работает автономно.
Если я не могу получить рабочий ответ для чистого SwiftUI, я просто повторно реализую приложение, используяNSAppDelegate
, в конце концов мне просто нужна рабочая ссылка на AppleScript.
Остается вопрос, возможно ли это в приложении SwiftUI?