SwiftUI 将下载的 PDF 附加到 iPadOS 14.0.1 中的电子邮件失败

Rob*_*hen 5 ios swift swiftui

我的项目要求我下载 .pdf 文件,将其保存在 iPad 本地,然后制作电子邮件并发送。看起来很直接。

这是执行下载的代码:

    func downloadFile() {

        let urlString = <private url>
        let url = URL(string: urlString)!

        
        let downloadTask = URLSession.shared.downloadTask(with: url) {
            urlOrNil, responseOrNil, errorOrNil in
            // check for and handle errors:
            // * errorOrNil should be nil
            // * responseOrNil should be an HTTPURLResponse with statusCode in 200..<299

            guard let fileURL = urlOrNil else { return }
            do {
                let documentsURL = try
                    FileManager.default.url(for: .documentDirectory,
                                            in: .userDomainMask,
                                            appropriateFor: nil,
                                            create: false)
                let savedURL = documentsURL.appendingPathComponent(url.lastPathComponent)
                
                try? FileManager.default.removeItem(at: savedURL)
                try FileManager.default.moveItem(at: fileURL, to: savedURL)
            } catch {
                print ("file error: \(error)")
                self.text = "File Error: \(error)"
            }
        }
        downloadTask.resume()
    }
Run Code Online (Sandbox Code Playgroud)

这是制作电子邮件的代码:(我遵循了这个例子:https : //www.thetopsites.net/article/58693164.shtml)(为了简洁,我省略了一些样板)

import SwiftUI
import MessageUI
//import PDFKit

//https://www.thetopsites.net/article/58693164.shtml


struct ContentView: View {
    @State var result: Result<MFMailComposeResult, Error>? = nil
    @State var isShowingMailView: Bool = false
    @State private var text: String = "Foobar"
    
    var body: some View {
        Button(action: {
            self.isShowingMailView.toggle()
        }) {
            Text("Mail Me")
        }
        .disabled(!MFMailComposeViewController.canSendMail())
        .sheet(isPresented: $isShowingMailView) {
            MailView(result: self.$result)
        }
    }

struct MailView: UIViewControllerRepresentable {

    @Environment(\.presentationMode) var presentation
    @Binding var result: Result<MFMailComposeResult, Error>?

    class Coordinator: NSObject, MFMailComposeViewControllerDelegate {

        @Binding var presentation: PresentationMode
        @Binding var result: Result<MFMailComposeResult, Error>?

        init(presentation: Binding<PresentationMode>,
             result: Binding<Result<MFMailComposeResult, Error>?>) {
            _presentation = presentation
            _result = result
        }

        func mailComposeController(_ controller: MFMailComposeViewController,
                                   didFinishWith result: MFMailComposeResult,
                                   error: Error?) {
            defer {
                $presentation.wrappedValue.dismiss()
            }
            guard error == nil else {
                self.result = .failure(error!)
                return
            }
            self.result = .success(result)
        }
    }

    func makeCoordinator() -> Coordinator {
        return Coordinator(presentation: presentation,
                           result: $result)
    }

    func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentsDirectory = paths[0]
        return documentsDirectory
    }
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<MailView>) -> MFMailComposeViewController {
        downloadFile()
        
        let urlString = "<privateurl>"
        let url = URL(string: urlString)

        let vc = MFMailComposeViewController()
        vc.mailComposeDelegate = context.coordinator
        vc.setToRecipients(["foo@bar.com"])
        vc.setMessageBody("Email Test", isHTML: true)
        vc.setSubject("email test")
    
        
        let docDirectory = getDocumentsDirectory()
        let filePath = docDirectory.appendingPathComponent("test.pdf")

        if let fileData = NSData(contentsOf: filePath) {
                 print("File data loaded.")
                 vc.addAttachmentData(fileData as Data, mimeType: "application/pdf", fileName: "foo.pdf")
         }
        return vc
    }

    func updateUIViewController(_ uiViewController: MFMailComposeViewController,
                                context: UIViewControllerRepresentableContext<MailView>) {

    }
}
Run Code Online (Sandbox Code Playgroud)

电子邮件中没有附加文件,我收到此错误: [PPT] Error creating the CFMessagePort needed to communicate with PPT.

我没有运气解决这个问题。如果有人可以提供任何想法,那就太好了。谢谢你。