代码之家  ›  专栏  ›  技术社区  ›  Roman

将swift文件添加到应用程序的资源包时出现问题

  •  2
  • Roman  · 技术社区  · 6 年前

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

    这是我的代码:

    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)
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   rmaddy    6 年前

    这里有一些问题。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")
        }
    }