为啥我的 Swift 应用程序无法编写脚本?

Posted

技术标签:

【中文标题】为啥我的 Swift 应用程序无法编写脚本?【英文标题】:Why isn't making my Swift app scriptable working?为什么我的 Swift 应用程序无法编写脚本? 【发布时间】:2019-11-21 10:13:37 【问题描述】:

我正在尝试制作一个 Swift 应用程序,“Earwig.app”,MacOS,可编写脚本。我首先从Making Cocoa Application Scriptable Swift 无耻地窃取了一个示例,添加了两个文件,一个.sdef 和一个.swift,如下所示。我在 info.plist 中设置了 Scriptable 和脚本定义文件名

我的 AppleScript 是:

tell application "EarwigServer" to save in "path/to/file"

运行脚本给我一个错误,“EarwigServer 出现错误:无法继续保存。”

此时我被卡住了。任何建议表示赞赏

sdef 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">

<dictionary title="ScriptableSwift Terminology">

    <suite name="ScriptableSwift Scripting Suite" code="SSss" description="Standard suite for application communication.">

        <command name="save" code="SSssSave" description="Save something.">
            <cocoa class="ScriptableSwift.SaveScriptCommand"/>
            <parameter name="in" code="Fpat" type="text" description="The file path in which to save the document.">
                <cocoa key="FilePath"/>
            </parameter>
            <result type="text" description="Echoes back the filepath supplied."/>
        </command>

    </suite>
</dictionary>

快速文件:

import Foundation
import Cocoa

class SaveScriptCommand: NSScriptCommand 
    override func performDefaultImplementation() -> Any? 
        print( "in" )
        let filePath = self.evaluatedArguments!["FilePath"] as! String

        print( "here" )
        return filePath
    

info.plist:

【问题讨论】:

它不能工作的原因有很多。麻烦的是任何微小的错误都会破坏整个功能。例如,您是否在 Info.plist 中添加了所需的键和值? 我很确定我的 info.plist 是正确的,但我已经编辑了帖子并添加了屏幕截图。我几乎只是从一个示例项目中添加了这两个文件,以便根据需要调整它们。我想知道我的类名 ScriptableSwift.SaveScriptCommand 是不是弄错了。我尝试了许多排列都没有运气。 【参考方案1】:

当我将 ScriptableSwift.SaveScriptCommand 更改为 EarwigServer.SaveScriptCommand 时,它开始工作。这似乎很明显,我知道,但我以前做过,但没有任何效果。在我清理构建文件夹之前,更改似乎不会生效。

这个xml有效,swift文件保持不变:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">

<dictionary title="EarwigServer Terminology">

    <suite name="EarwigServer Scripting Suite" code="ESss" description="Standard suite for application communication.">

        <command name="run" code="ESssErun" description="Save something.">
            <cocoa class="EarwigServer.SaveScriptCommand"/>

            <parameter name="in" code="Fpat" type="text" description="The file path in which to save the document.">
                <cocoa key="FilePath"/>
            </parameter>
            <result type="text" description="Echoes back the filepath supplied."/>
        </command>

    </suite>
</dictionary>

感谢您的意见

【讨论】:

另外,sdef 文件中的 XML 对语法非常敏感,而在脚本编辑器中运行脚本时反馈错误非常无助。我在第一行的 XML 标记之前引入了一个选项卡,并且花了一段时间才找到它。在 osascript 中运行脚本报告了文件中的错误,而在脚本编辑器中运行脚本只是返回了一个模糊的错误。 你帮了我很多

以上是关于为啥我的 Swift 应用程序无法编写脚本?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Swift 应用程序上解析服务器 PHP

Swift:多个函数同时工作

为啥链接器无法识别我的链接器脚本中定义的入口点

为啥我的 Xampp Apache 服务器无法打开一个 PHP 脚本?

为啥 Swift 编译时间这么慢?

为啥我的 UICollectionView 单元格在我的 swift ios 应用程序中不可点击?