Передача переменных в AppleScript

Код для запуска моего AppleScript в Xcode следующий:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Script" ofType:@"scpt"];

NSAppleScript *script = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:nil];

[script executeAndReturnError:nil];

Перед тем, как выполнить его, мне было интересно, можно ли установить некоторые переменные для его использования. Другими словами, я хочу передать переменные из моего приложения в AppleScript.

3 ответа

Решение

Вы можете использовать метод:

- (id)initWithSource:(NSString *)source

и использовать stringWithFormat построить свой исходный текст Jaxcript и установить аргументы.

NSString* scriptTemplate = ...;
NSString* actualScript = [NSString stringWithFormat:scriptTemplate, arg1, arg2, ... argN];
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:actualScript];

Вы также можете разработать более продвинутый механизм замены, где вы как-то помечаете свои параметры в "Script.scpt", а затем заменяете их, используя stringByReplacingOccurrencesOfString:withString:

Лучший пример, который я нашел, это код от Куинна "Эскимос!" на форумах разработчиков Apple:

https://forums.developer.apple.com/thread/98830

Файл AppleScript:

on displayMessage(message)  
    tell application "Finder"  
        activate  
        display dialog message buttons {"OK"} default button "OK"  
    end tell  
end displayMessage 

Вызовите метод AppleScript из Swift, передав параметры:

let parameters = NSAppleEventDescriptor.list()
parameters.insert(NSAppleEventDescriptor(string: "Hello Cruel World!"), at: 0)

let event = NSAppleEventDescriptor(
    eventClass: AEEventClass(kASAppleScriptSuite),
    eventID: AEEventID(kASSubroutineEvent),
    targetDescriptor: nil,
    returnID: AEReturnID(kAutoGenerateReturnID),
    transactionID: AETransactionID(kAnyTransactionID)
)
event.setDescriptor(NSAppleEventDescriptor(string: "displayMessage"), forKeyword: AEKeyword(keyASSubroutineName))
event.setDescriptor(parameters, forKeyword: AEKeyword(keyDirectObject))

let appleScript = try! NSUserAppleScriptTask(url: yourAppleScriptFileURL)
appleScript.execute(withAppleEvent: event) { (appleEvent, error) in
    if let error = error {
        print(error)
    }
}

Версия с обработкой возвращаемого значения. (на основе кода Куинна)

      import Carbon
// ...
let script = """
on displayMessage(message)
    display dialog message
    return "hello…"
end displayMessage
"""

let handler = NSAppleEventDescriptor(string: "displayMessage")
let message = NSAppleEventDescriptor(string: "Hello AppleScript!")

let parameters = NSAppleEventDescriptor.list()
parameters.insert(message, at: 0)

let event = NSAppleEventDescriptor(
    eventClass: AEEventClass(kASAppleScriptSuite),
    eventID: AEEventID(kASSubroutineEvent),
    targetDescriptor: nil,
    returnID: AEReturnID(kAutoGenerateReturnID),
    transactionID: AETransactionID(kAnyTransactionID)
)
event.setDescriptor(handler, forKeyword: AEKeyword(keyASSubroutineName))
event.setDescriptor(parameters, forKeyword: AEKeyword(keyDirectObject))

var error: NSDictionary?
if let appleScript = NSAppleScript(source: script) {
    if let outputString = appleScript.executeAppleEvent(event, error: &error).stringValue {
        print("output: ", outputString)
    } else if (error != nil) {
        print("error: ", error!)
    }
}
Другие вопросы по тегам