2016-06-14 17 views
2

Ich habe eine Desktop-Anwendung, die E-Mail-URLs ("Nachricht: //" Schema) von der Drag & Drop-Pappe erhalten und ich möchte der Betreff aus der entsprechenden Nachricht. Der einzige Hinweis, den ich bis jetzt habe, ist, dass die QuickLook Bibliothek mir ein Informationsobjekt geben kann, wo ich diese Informationen abrufen kann. Da die QuickLook API im Moment eher im Fluss zu sein scheint und die meisten Beispiele zeigen, wie man sie in iOS verwendet, kann ich einfach keinen Weg finden, mein "Vorschau" -Objekt über eine URL einzurichten und die Informationen von dort zu bekommen .So erhalten Sie E-Mail-Betreff von Nachricht: // URL in OSX Swift

Ich möchte vermeiden, mein Projekt als QuickLook Plugin einzurichten, oder Einrichten der gesamten Voransicht/Ansicht Gerüstbau; Im Moment möchte ich nur herausbekommen, was QuickLook lädt, bevor es angezeigt wird, aber ich kann nicht verstehen, welches Paradigma Apple von mir möchte, dass es hier implementiert wird.

XCode 7.3.1. 

Antwort

1

Es stellt sich heraus, dass ich den Inhalt draggingInfo.draggingPasteboard().types als eine hierarchische Liste enthält nur eine Art von Informationen (URL in diesem Fall) falsch interpretiert. Mußten geschleppt Ereignistyp kUTTypeMessage as String abonnieren und den E-Mail-Betreff aus dem Karton mit stringForType("public.url-name")

EDIT abrufen: Beachten Sie, dass die aktuelle Mail.app wird manchmal einen Stapel von E-Mail erstellen, wenn Sie eine E-Mail ziehen Faden. Obwohl die obige Methode immer noch funktioniert, um den Subjekt des Stapels zu erhalten, gibt es keine URL in den Zieh-Informationen, und da es auch keine Liste von Nachrichten-IDs gibt, musste ich auf das Mbox-Verzeichnis des Benutzers zurückgreifen:

 // See if we can resolve e-mail message meta data 
     if let mboxPath = pboard.stringForType("com.apple.mail.PasteboardTypeMessageTransfer") { 
      if let automatorPlist = pboard.propertyListForType("com.apple.mail.PasteboardTypeAutomator") { 
       // Get the latest e-mail in the thread 
       if let maxID = (automatorPlist.allObjects.flatMap({ $0["id"]! }) as AnyObject).valueForKeyPath("@max.self") as? Int { 
        // Read its meta data in the background 
        let emailItem = draggingEmailItem 
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
         // Find the e-mail file 
         if let path = Util.findEmlById(searchPath: mboxPath, id: maxID) { 
          // Read its contents 
          emailItem.properties = Util.metaDataFromEml(path) 
          dispatch_async(dispatch_get_main_queue(), { 
           // Update UI 
          }); 
         } 
        } 
       } 
      } 
     } 

Util funcs:

/* Searches the given path for <id>.eml[x] and returns its URL if found 
*/ 
static func findEmlById(searchPath searchPath: String, id: Int)-> NSURL? { 
    let enumerator = NSFileManager.defaultManager().enumeratorAtPath(searchPath) 
    while let element = enumerator?.nextObject() as? NSString { 
     switch (element.lastPathComponent, element.pathExtension) { 
      case (let lpc, "emlx") where lpc.hasPrefix("\(id)"): 
       return NSURL(fileURLWithPath: searchPath).URLByAppendingPathComponent(element as String)! 
      case (let lpc, "eml") where lpc.hasPrefix("\(id)"): 
       return NSURL(fileURLWithPath: searchPath).URLByAppendingPathComponent(element as String)! 
      default:() 
     } 
    } 
    return nil 
} 

/* Reads an eml[x] file and parses it, looking for e-mail meta data 
*/ 
static func metaDataFromEml(path: NSURL)-> Dictionary<String, AnyObject> { 

    // TODO Support more fields 

    var properties: Dictionary<String, AnyObject> = [:] 
    do { 
     let emlxContent = try String(contentsOfURL: path, encoding: NSUTF8StringEncoding) 
     // Parse message ID from "...\nMessage-ID: <...>" 
     let messageIdStrMatches = emlxContent.regexMatches("[\\n\\r].*Message-ID:\\s*<([^\n\r]*)>") 
     if !messageIdStrMatches.isEmpty { 
      properties["messageId"] = messageIdStrMatches[0] as String 
     } 
    } 
    catch { 
     print("ERROR: Failed to open emlx file") 
    } 
    return properties 
} 

Hinweis: Wenn Ihre App Sandbox Sie mit einer Zeichenfolge in den com.apple.security.temporary-exception.files.home-relative-path.read-only Berechtigungssatz auf ein Array benötigen: /Library/