首页 > 解决方案 > SwiftUI:如何在 macOS 上从 Mail 中拖放电子邮件

问题描述

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

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 类型的表示

这个功能一直让我望而却步,因此非常感谢任何帮助。

标签: macosemailswiftuidrag-and-drop

解决方案


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

如果我们为通用kUTTypeContentUTI 注册 self 并调查来自 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

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


推荐阅读