Создание приложения Какао Scriptable Swift

Цель

Я пытаюсь сделать приложение Какао, написанное на Swift, сценарием из Applescript.

Что я сделал

Я создал файл SDEF, настроил мой info.plist и создал класс, который я считаю подходящим.

definition.sdef

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


<dictionary title="SamX">

    <!-- specific suite(s) for the application follow... -->
    <suite name="SamX Scripting Suite" code="Samx" description="Suite for communication with the application">

        <command name="savedoc" code="corecnte" description="description">
            <cocoa class="ProjectName.ScriptingSaveNotification" id="BLah"/>

            <parameter name="with dname" code="WTdc" type="text" optional="no" description="description">
                <cocoa key="DocumentName"/>
            </parameter>

            <result type="boolean" description="The result of the invocation. True if it succeeds, False if it does not"/>
        </command>
    </suite>
</dictionary>

info.plist

Info.plist

ScriptingSaveNotification.swift

import Foundation
import Cocoa

class ScriptingSaveNotification: NSScriptCommand, NSUserNotificationCenterDelegate {

    override func performDefaultImplementation() -> AnyObject? {
        let parms = self.evaluatedArguments
        var name = ""
        if let args = parms {
            if let DocumentName = args["DocumentName"] as? String {
                name = DocumentName
            }
        }


        debugPrint("We were prompted to save");
        return "hello world"
    }

    func userNotificationCenter(center: NSUserNotificationCenter, shouldPresentNotification notification: NSUserNotification) -> Bool {
        debugPrint("We were prompted to save");

        return true
    }
}

Где я

У меня есть приложение, которое запускается. SDEF-файл приложения отображается в редакторе Applescript. Редакторы Applescript также возвращают определение словаря. Однако, когда я запускаю команду, я всегда получаю вывод 5 (int), и ни одна из моих строк отладки не выводится в XCode.

Мне кажется, что, возможно, я неправильно ссылаюсь на свой класс в SDEF. Но я не уверен на 100%. Я пытался переименовать его несколько раз. Любая помощь будет принята с благодарностью.

Толковый словарь

Тестовый скрипт

tell application "MyApplication"
    set testString to "Hello"
    set returnValue to savedoc testString
    display alert returnValue
end tell

1 ответ

Решение

Редактировать:

Основная проблема заключается в том, что вы на самом деле не используете with dname параметр в вашем скрипте. Так должно быть:

set returnValue to savedoc with dname testString

Тем не менее, информация ниже по-прежнему действительна для создания правильного sdef и другие предложения / примеры могут быть полезны.


Это основной пример передачи строки в evaluatedArguments из NSScriptCommand а затем вернуть эту строку в результате выполнения команды сценария в Swift (вы можете вернуть логическое значение в случае успеха / неудачи команды или любого другого типа результата; и, фактически, в вашем sdef Вы говорите, что собираетесь вернуть boolean но ваша команда возвращает string (text в sdef определений)). Создание вашего sdef может быть сложно. Код вашей команды должен начинаться с кода набора, и вы можете удалить id а также optional параметр (если вы пропустите optional параметр, по умолчанию это обязательный параметр). Если вам нужен только один параметр, вы также можете просто использовать direct-parameter вместо.

Вы можете скачать демонстрационный проект:

http://www.jonn8.com/dist/ScriptableSwift.zip

Вот соответствующие биты (кроме plist записи, которые вы исправили в своих тестах).

ScriptableSwift.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>

SaveScriptCommand.swift

import Foundation
import Cocoa

class SaveScriptCommand: NSScriptCommand {
    override func performDefaultImplementation() -> AnyObject? {
        let filePath = self.evaluatedArguments!["FilePath"] as! String
        debugPrint("We were prompted to save something at: \(filePath)");
        return filePath
    }
}

Тест AppleScript

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

Результат:

"path/to/file"
Другие вопросы по тегам