2016-06-14 58 views
2

我有一個接收電子郵件的URL的桌面應用程序(「消息://」方案)從拖動&下降紙板,我想主題來自相關訊息。唯一的線索我有,到目前爲止,就是QuickLook庫可能給我一個信息對象,我可以檢索此信息。如何從消息電子郵件主題:在OSX斯威夫特// URL

由於QuickLook API似乎相當流行,大多數例子顯示如何在iOS中使用它,我根本無法找到一種方法來設置我的「預覽」對象使用URL並從那裏獲取信息。

我想避免設置我的項目作爲QuickLook插件,或設立全預覽窗格/視圖腳手架;目前我只想在QuickLook開始顯示之前加載它,但我無法理解蘋果希望我在此實現的範例。

XCode 7.3.1. 

回答

1

原來我誤解的draggingInfo.draggingPasteboard().types的內容只包含一個(在這種情況下URL)類型信息的分層列表。 只好訂閱拖事件類型kUTTypeMessage as String和檢索剪貼板的電子郵件主題與stringForType("public.url-name")

編輯:請注意,當前Mail.app將有時創建郵件堆棧當您將一封電子郵件線。儘管上面的方法仍然可以獲得堆棧的主題,但是在拖動信息中沒有URL,並且由於沒有可用的Message-ID列表,我不得不求助於刮取用戶的mbox目錄:

 // 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 
} 

注意:如果您的應用沙盒,你將需要com.apple.security.temporary-exception.files.home-relative-path.read-only授權集到一個數組中已有一個字符串:/Library/