You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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运行时类名,去掉模块前缀依赖:
    import Foundation
    @objc(ProgressCommand) // 显式声明ObjC侧的类名
    class ProgressCommand: NSScriptCommand {
        override func performDefaultImplementation() -> Any? {
            print("自定义progress命令触发")
            return nil
        }
    }
    
    同步修改sdef文件中的类配置,去掉模块前缀:
    <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 设为 YES
    • OSASCRIPTING_DEFINITION 填入值 Progression.sdef

注:你之前测试可正常运行的quit命令是Cocoa标准套件内置命令,由NSApplication默认实现,不需要自定义脚本配置即可响应,不能作为自定义配置生效的判断依据。

修改完成后清理Build文件夹、删除DerivedData下的旧编译产物,重新编译运行应用,再执行以下测试脚本即可正常触发自定义命令,不会再抛出-1708错误:

tell application "Progression"
  progress
end tell

内容的提问来源于stack exchange,提问作者ocodo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:39:18