2016-06-14 11 views
2

ドラフトから電子メールURL(「メッセージ://」スキーム)を受信するデスクトップアプリがあります。関連するメッセージからのSubject。私が持っている唯一の手掛かりは、これまでのところ、QuickLookライブラリが私にこの情報を取得できる情報オブジェクトを与えるかもしれないということです。メッセージから件名を取得する方法:// OSX SwiftのURL

現時点では、フラットになっているようで、ほとんどの例でiOSでの使用方法が分かりますから、URLを使用して「プレビュー」オブジェクトを設定してそこから情報を取得する方法は見つけられません。

私のプロジェクトをQuickLookプラグインとして設定したり、プレビューペイン/ビューの足場全体を設定しないようにしたいと思います。現時点ではQuickLookが表示される前にQuickLookがロードする内容を知りたいだけですが、Appleがここで実装するパラダイムのパラダイムを理解することはできません。

XCode 7.3.1. 

答えて

1

それは私が(この場合はURL)情報の一種類のみを含む階層リストとしてdraggingInfo.draggingPasteboard().typesの内容を誤解判明します。 は、ドラッグイベントタイプkUTTypeMessage as Stringに加入し、stringForType("public.url-name")

EDITとペーストボードからの電子メールの件名を取得するために持っていた:あなたは電子メールをドラッグすると、現在のMail.appが時々は、メールのスタックを作成することに注意してください糸。上記の方法はまだスタックの主題を取得するために働いていますが、ドラッグ情報にはURLがなく、どちらのメッセージ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 
} 

注:アプリがサンドボックス化されている場合は、その中に1つの文字列の配列にcom.apple.security.temporary-exception.files.home-relative-path.read-only資格セットが必要になります。/Library/

関連する問題