Drag and Drop aus Apple Mail

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Drag and Drop aus Apple Mail

    Hallo zusammen!

    Ich arbeite zur Zeit an einer App für macOS, die E-Mails aus Apple Mail via Drag and Drop entgegen nehmen können muss.

    Apple Mail legt dafür ja glücklicherweise sogar die .eml Repräsentationen der gedragten E-Mails via File Promise in das dragging pasteboard, ganz ohne private API oder ähnliches.

    Bei mir kommt es beim resolven des File Promis jetzt aber zu einem "interessanten" Problem: Der Code Block zum resolven des File Promise bleibt, nachdem die E-Mails in das richtige View gedragt worden sind, für relativ genau 60 Sekunden hängen und gibt dann folgenden Fehler zurück:

    Quellcode

    1. - Error Domain=NSURLErrorDomain Code=-1001 "(null)" #0

    Gleichzeitig schreibt Apple Mail aber die .eml Datei(en) an die location, die ich meinem FilePromiseReceiver mitgebe. ?(
    Und wenn ich den gleichen Code nehme, und eine E-Mail aus, beispielsweise, Microsoft Outlook drauf ziehe, funktioniert der Code und das File Promise funktioniert ohne Probleme und gibt auch die richtige URL zurück. Doppel ?( ?( .

    Mein Code für das File Promise hier, und ein komplettes Xcode Project für eine macOS app, die das Problem demonstriert gibt es hier.

    Quellcode: DropView.swift

    1. private lazy var destinationURL: URL = {
    2. let destinationURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(
    3. "Drops")
    4. try? FileManager.default.createDirectory(
    5. at: destinationURL, withIntermediateDirectories: true, attributes: nil)
    6. return destinationURL
    7. }()
    8. override func performDragOperation(_ sender: NSDraggingInfo) -> Bool {
    9. let pasteboard: NSPasteboard = sender.draggingPasteboard
    10. guard
    11. let filePromises = pasteboard.readObjects(
    12. forClasses: [NSFilePromiseReceiver.self], options: nil) as? [NSFilePromiseReceiver]
    13. else {
    14. return false
    15. }
    16. print("Files dropped")
    17. let operationQueue = OperationQueue()
    18. print("Destination URL: \(destinationURL)")
    19. filePromises.forEach({ filePromiseReceiver in
    20. filePromiseReceiver.receivePromisedFiles(
    21. atDestination: destinationURL,
    22. options: [:],
    23. operationQueue: operationQueue,
    24. reader: { (_, error) in
    25. print("we're le done")
    26. if let error = error {
    27. dump(error)
    28. } else {
    29. print("Received file at url ")
    30. }
    31. print(filePromiseReceiver.fileNames, filePromiseReceiver.fileTypes)
    32. })
    33. })
    34. return true
    35. }
    Alles anzeigen

    Hat hier jemand eine Idee, woran das liegen könnte? Das kann doch nicht wirklich ein Problem mit Apple Mail selbst sein... hoffe ich. Ich bin jedenfalls kurz davor, ein code-level support Ticket hierauf zu verbrennen, weil's mich langsam in den Wahnsinn treibt...
  • Ich vermute, dass es ein Problem mit der OperationQueue gibt:
    Im forEach werden die Mails gelesen, aber die Queue wird vermutlich
    schon freigegeben, wenn die Methode performDragOperation verlassen wird.
    forEach wartet vermutlich nicht bis der Reader abgearbeitet ist.

    Etwas seltsam ist natürlich, wenn es bei Outlook funktioniert und bei
    Apple Mail nicht. Ich würde das genannte Probleme trotzdem prüfen und
    ggf beheben.