我的项目要求我下载 .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.
我没有运气解决这个问题。如果有人可以提供任何想法,那就太好了。谢谢你。