首页 > 解决方案 > Swift:调用 AppleScript 获取邮件选择很慢

问题描述

我正在使用以下 Swift 执行 AppleScript 以捕获 Apple Mail 中当前选定的消息。

func getMessage(messageID: String) -> String?
{
    if let url = Bundle.main.url(forResource: "getMessages", withExtension: "scpt") //need to add it to the build phases
    {
        var appleScriptError: NSDictionary? = nil
        guard let script = NSAppleScript(contentsOf: url, error: &appleScriptError) else 
        {
            return nil
        }

        let message = NSAppleEventDescriptor(string: messageID)

        let parameters = NSAppleEventDescriptor(listDescriptor: ())
        parameters.insert(message, at: 1)

        var psn = ProcessSerialNumber(highLongOfPSN: UInt32(0), lowLongOfPSN: UInt32(kCurrentProcess))

        let target = NSAppleEventDescriptor(descriptorType: typeProcessSerialNumber, bytes: &psn, length: MemoryLayout<ProcessSerialNumber>.size)

        let handler = NSAppleEventDescriptor(string: "getMessages")

        let event = NSAppleEventDescriptor.appleEvent(withEventClass: AEEventClass(kASAppleScriptSuite), eventID: AEEventID(kASSubroutineEvent), targetDescriptor: target, returnID: AEReturnID(kAutoGenerateReturnID), transactionID: AETransactionID(kAnyTransactionID))

        event.setParam(handler, forKeyword: AEKeyword(keyASSubroutineName))
        event.setParam(parameters, forKeyword: AEKeyword(keyDirectObject))

        var executeError: NSDictionary? = nil
        let result = script.executeAppleEvent(event, error: &executeError)
        if let executeError = executeError
        {
            print("ERROR: \(executeError)")
            return nil
        }
        else
        {
            return (result.stringValue ?? "")
        }
    }
    return nil
}

它调用这个 AppleScript:

on getMessages(messageID)
    tell application "Mail"

        my dlog("Start getMessages")

        set theSelection to selection

        my dlog("Got the selection")

        set returnString to ""
        repeat with theMessage in selection
            set messageUUID to message id of theMessage
            my dlog("Message " & messageUUID)
            set messageSender to my getMessageSenderName(sender of theMessage)
            set messageBody to my getMessageBody(content of theMessage)
            set messageDate to my ISODate(date received of theMessage)

            my saveMessage(theMessage, mailPath)

        end repeat
        my dlog("End getMessages")
        return returnString
    end tell
    return "-"
end getMessages

on dlog(message)
    do shell script "logger -t 'AS DEBUG' getMessage: " & message
end dlog

我遇到的问题是对选择命令的任何调用都需要永远执行。

从控制台:

10:49:39.036005+0100 getMessage: 开始 getMessages 10:50:03.618299+0100 getMessage: 得到选择 10:50:03.648670+0100 getMessage: Message 3c7f13fb334e41e21cf231212c77f199@www.domain.com 10:50:03.648670+0100 7

在此示例中,执行需要 24 秒。AppleScript 的其余部分非常快。我如何重组我的代码并不重要,任何对选择的调用都会花费这么多时间。随后的选择调用也很快。

如果我直接从 AppleScript 执行相同的命令,它也非常快。

我做错了什么还是发生了其他事情?

标签: swiftapplescriptapple-mail

解决方案


推荐阅读