SwiftUI:如何在 macOS 上从 Mail 中拖放电子邮件

Posted

技术标签:

【中文标题】SwiftUI:如何在 macOS 上从 Mail 中拖放电子邮件【英文标题】:SwiftUI: How to drag and drop an email from Mail on macOS 【发布时间】:2021-02-20 11:40:16 【问题描述】:

作为@Asperi 回答我关于如何拖放contacts 的问题的后续行动,我还希望能够以同样的方式拖放电子邮件。这是我的代码:

import SwiftUI
import UniformTypeIdentifiers
let uttypes = [String(kUTTypeEmailMessage)]

struct ContentView: View

    let dropDelegate = EmailDropDelegate()

    var body: some View
    
        VStack
        
            Text("Drag your email here!")
            .padding(20)
        
        .onDrop(of: uttypes, delegate: dropDelegate)
    


struct EmailDropDelegate: DropDelegate


    func validateDrop(info: DropInfo) -> Bool
    
        return true
    
    
    func dropEntered(info: DropInfo)
    
        print ("Drop Entered")
    
    
    func performDrop(info: DropInfo) -> Bool
    
        let items = info.itemProviders(for: uttypes)
        for item in items
        
            print (item.registeredTypeIdentifiers) // prints []

            item.loadDataRepresentation(forTypeIdentifier: kUTTypeEmailMessage as String, completionHandler:  (data, error) in
                if let data = data
                
                    print(data)
                
            )
         
        return true
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

我没有得到任何可以解码的数据。

2020-11-08 09:34:54.877532+0000 DropContact[3856:124769] 找不到符合 public.email-message 类型的表示

这个功能一直困扰着我,所以非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

嗯...方法是一样的,唯一的问题是Apple Mail 不提供kUTTypeEmailMessage UTI 表示拖拽(复制)

如果我们将 self 注册为通用 kUTTypeContent UTI 并调查来自 Mail 的投递邮件的粘贴板内容,我们会得到:

也就是说,这是一个完整的表示列表:

com.apple.mail.PasteboardTypeMessageTransfer,
com.apple.mail.PasteboardTypeAutomator,
com.apple.pasteboard.promised-file-url,
dyn.ah62d4rv4gu8y6y4usm1044pxqzb085xyqz1hk64uqm10c6xenv61a3k,
NSPromiseContentsPboardType,
com.apple.pasteboard.promised-file-content-type,
dyn.ah62d4rv4gu8yc6durvwwa3xmrvw1gkdusm1044pxqyuha2pxsvw0e55bsmwca7d3sbwu,
Apple files promise pasteboard type,
public.url,
CorePasteboardFlavorType 0x75726C20,
dyn.ah62d4rv4gu8yc6durvwwaznwmuuha2pxsvw0e55bsmwca7d3sbwu,
Apple URL pasteboard type,
public.url-name,
CorePasteboardFlavorType 0x75726C6E,
public.utf8-plain-text,
NSStringPboardType

所以现在您可以从上面加载任何这些类型的数据(当然 Apple 自己的私有数据除外)。而且,顺便说一下,该列表可能(而且更确切地说将)取决于 macOS 版本。

【讨论】:

这很有趣。如果我将其中任何一个切换出去,我仍然会得到零数据。我一定遗漏了一些明显的东西。谢谢 谁能帮忙? 如果有人能解决这个问题,我将提供 1000 赏金!

以上是关于SwiftUI:如何在 macOS 上从 Mail 中拖放电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在 MacOS Mojave 上从 PyInstaller 运行应用程序后如何修复 msgcat::mc 错误?

SwiftUI - 如何在 macOS 上隐藏窗口标题

(SwiftUI, MacOS 11.0) 如何在 SecureTextFeild 中检测焦点?

SwiftUI:如何在 macOS 11 上使用 NSSearchToolBarItem?

如何在 macOS 上检测 SwiftUI 中的键盘事件?

如何在 macOS 上检测 SwiftUI 中的键盘事件?