3

对于我的应用程序,我需要能够直接从应用程序发送带有各种类型附件的电子邮件。我找到了一些解决方案并对其进行了测试。

如果我尝试从我的应用程序发送 .zip 或 .txt 文件,它工作正常。但我无法发送“.swift”类型的文件。有人知道它是如何工作的吗?

这是我的代码:

import UIKit
import MessageUI

class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
    var EmailTxt = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        setEmailTxt()
        sendEmail()
        view.backgroundColor = UIColor.lightGray
    }

    func sendEmail() {
        if MFMailComposeViewController.canSendMail() {
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self
            mail.setToRecipients(["sgamesro@gmail.com"])
            mail.setMessageBody(EmailTxt, isHTML: true)
            mail.setSubject("test email")

            if let filePath = Bundle.main.path(forResource: "test", ofType: "swift") {
                print("# File path loaded.")

                if let fileData = NSData(contentsOfFile: filePath) {
                    print("File data loaded.")
                    mail.addAttachmentData(fileData as Data, mimeType: "swift", fileName: "test.swift")

                }
            }

            present(mail, animated: true)
        } else {
            // show failure alert
            print("# func sendEmail() Mistake")
        }
    }

    func setEmailTxt() {
        EmailTxt = "<p>test line 01</p> <p>test line 02</p>" //<p>This is some text in a paragraph.</p>
    }

    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        controller.dismiss(animated: true)
    }
}
4

1 回答 1

3

这里有几个问题。Xcode 不喜欢将 .swift 文件放在资源包中。

第一个明显的解决方法是转到目标“构建阶段”下的“复制捆绑资源”部分并添加 .swift 文件。

这类作品。但它不会复制原始的 .swift 文件,它会复制与 .swift 文件的编译版本关联的两个相关文件。

而且似乎没有办法阻止 Xcode 编译 Swift 文件,即使它没有列在“构建阶段”的“编译源”部分下。

这是我要做的:

将您想要在应用程序包中的 .swift 文件重命名为 .swiftx 以获得其他类似的字段扩展名。确保该文件位于“复制捆绑资源”下的列表中。

然后将您的代码更新为:

if let fileURL = Bundle.main.url(forResource: "test", withExtension: "swiftx") {
    print("# File path loaded.")

    if let fileData = Data(contentsOf: fileURL) {
        print("File data loaded.")
        mail.addAttachmentData(fileData, mimeType: "text/plain", fileName: "test.swift")
    }
}
于 2018-05-29T14:48:02.830 回答