SwiftUI应用接入AppleScript/JXA脚本支持报-1708错误求解
解答
纯SwiftUI应用是否支持AppleScript/JXA脚本?
- 完全支持,无需重构为
NSAppDelegate架构。SwiftUI应用生命周期底层仍基于AppKit实现,AppleScript调度逻辑不受上层UI框架选型影响,配置正确即可正常工作,你遇到的问题和SwiftUI本身无关,是配置细节踩了Swift版本与Xcode配置的兼容坑。
自定义命令报-1708错误的修复方案
你当前的配置存在3个核心问题,按顺序修改即可解决:
- 修复ObjC运行时类名不匹配问题
Swift 5+ 默认会给类加模块命名空间,且会裁剪未显式暴露给ObjC的类名,你在sdef中写的Progression.ProgressCommand无法被脚本系统在运行时找到,就会抛出-1708错误。
首先修改Swift类实现,显式指定ObjC运行时类名,去掉模块前缀依赖:
同步修改sdef文件中的类配置,去掉模块前缀:import Foundation @objc(ProgressCommand) // 显式声明ObjC侧的类名 class ProgressCommand: NSScriptCommand { override func performDefaultImplementation() -> Any? { print("自定义progress命令触发") return nil } }<cocoa class="ProgressCommand"/> - 修复命令四字符编码不符合规范的问题
Apple Event的命令编码必须为8位长度,格式为「4位套件编码 + 4位命令编码」,你当前配置的proGress只有7位,会导致命令能被脚本编辑器字典识别,但无法正确路由到实现类。
你的套件编码为PrgN,可以给progress命令分配4位编码pgrs,组合为8位编码PrgNpgrs,对应sdef修改为:<command name="progress" code="PrgNpgrs"> <cocoa class="ProgressCommand"/> </command> - 修复Xcode配置覆盖问题
Xcode 13+ 对SwiftUI项目默认开启Info.plist自动生成,你手动补的plist条目如果没有同步到Build Settings配置,会被Xcode自动生成的默认值覆盖。需要在Target的Build Settings中显式配置以下项:ENABLE_APP_SANDBOX设为No(不要仅在entitlements文件中修改)NSAppleScriptEnabled设为YESOSASCRIPTING_DEFINITION填入值Progression.sdef
注:你之前测试可正常运行的
quit命令是Cocoa标准套件内置命令,由NSApplication默认实现,不需要自定义脚本配置即可响应,不能作为自定义配置生效的判断依据。
修改完成后清理Build文件夹、删除DerivedData下的旧编译产物,重新编译运行应用,再执行以下测试脚本即可正常触发自定义命令,不会再抛出-1708错误:
tell application "Progression" progress end tell
内容的提问来源于stack exchange,提问作者ocodo
相关产品推荐
相关产品推荐

