通过电子邮件发送音频文件作为IOS Swift中的附件不会附加文件

时间:2018-01-02 03:11:55

标签: ios swift

我正在尝试使用MessageUI发送mp4音频文件作为附件

我有一个包含用户可以选择发送的不同文件的tableview,当用户在电子邮件选项上滑动行和点击时,会弹出一个电子邮件表单以及将要发送的文件。我能够找到文件位置但不能加载数据。这是我的代码。

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
{
    let mail = UITableViewRowAction(style: .normal, title: "Mail") { action, index in
        let mailComposeViewController = self.configureMailController()

        if MFMailComposeViewController.canSendMail() {
            if let filePath = URL(string: self.filesArray[indexPath.row]) {
                print(filePath)
                if let fileData = NSData(contentsOfFile: String(describing: filePath)) {
                    print("file data loaded")
                    mailComposeViewController.addAttachmentData( fileData as Data, mimeType: "audio/mp4", fileName: self.filesArray[indexPath.row])

                }
            }
            self.present(mailComposeViewController, animated: true, completion: nil)
        } else {
            self.showMailError()
        }
    }
    let delete = UITableViewRowAction(style: .default, title: "Delete") { action, index in
        try? FileManager.default.removeItem(at: self.getDirectory().appendingPathComponent("\(indexPath.row).mp4"))

        self.filesArray.remove(at: indexPath.row)
        self.fileDateInfoArray.remove(at: indexPath.row)
        self.fileStamps.remove(at: indexPath.row)
        tableView.reloadData()
        UserDefaults.standard.set(self.filesArray, forKey: "arrayOfRecordedFiles")
        UserDefaults.standard.set(self.fileDateInfoArray, forKey: "arrayOfDates")
        UserDefaults.standard.set(self.fileStamps, forKey: "arrayOfTimeStamps")
    }
    return [delete, mail]
}


func configureMailController() -> MFMailComposeViewController {

    let mailComposerVC = MFMailComposeViewController()
    mailComposerVC.mailComposeDelegate = self

    mailComposerVC.setSubject("Citrus Piano")

    return mailComposerVC
}

func showMailError() {
    let sendMailErrorAlert = UIAlertController(title: "Could not send email", message: "Your device could not send email", preferredStyle: .alert)
    let dismiss = UIAlertAction(title: "Ok", style: .default, handler: nil)
    sendMailErrorAlert.addAction(dismiss)
    self.present(sendMailErrorAlert, animated: true, completion: nil)
}

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

1 个答案:

答案 0 :(得分:0)

尝试使用以下功能附加音频文件

func configuredMailComposeViewController() -> MFMailComposeViewController {
    let mailComposerVC = MFMailComposeViewController()
    mailComposerVC.mailComposeDelegate = self
    mailComposerVC.setToRecipients(["iosGeek@gmail.com"])
    mailComposerVC.setSubject("New Request")

        // locate folder containing audio file
        let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
        let AudioFileNameToBeAdded = (documentsPath as NSString).appendingPathComponent("/yourFolderName/\(audioFileNameAtIndex)")
        let fileData = NSData(contentsOfFile: AudioFileNameToBeAdded)
        mailComposerVC.addAttachmentData(fileData! as Data, mimeType: "audio/wav", fileName: self.audioFileNameAtIndex)

    mailComposerVC.setMessageBody("", isHTML: false)
    return mailComposerVC
}

我的输出:

enter image description here

我认为在你的情况下 功能可能是

- > 如果要将文件保存在文件夹中

func configuredMailComposeViewController() -> MFMailComposeViewController {
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setToRecipients(["iosGeek@gmail.com"])
        mailComposerVC.setSubject("New Request")

            // locate folder containing audio file
            let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
            let AudioFileNameToBeAdded = (documentsPath as NSString).appendingPathComponent("/yourFolderName/\(audioFileNameAtIndex)")
            let fileData = NSData(contentsOfFile: AudioFileNameToBeAdded)
            mailComposerVC.addAttachmentData(fileData! as Data, mimeType: "audio/mp4", fileName: self.audioFileNameAtIndex)

        mailComposerVC.setMessageBody("", isHTML: false)
        return mailComposerVC
    }

- > 如果您直接将其保存在目录

func configuredMailComposeViewController() -> MFMailComposeViewController {
        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self
        mailComposerVC.setToRecipients(["iosGeek@gmail.com"])
        mailComposerVC.setSubject("New Request")

            // locate folder containing audio file
            let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
            let AudioFileNameToBeAdded = (documentsPath as NSString).appendingPathComponent(audioFileNameAtIndex)
            let fileData = NSData(contentsOfFile: AudioFileNameToBeAdded)
            mailComposerVC.addAttachmentData(fileData! as Data, mimeType: "audio/mp4", fileName: audioFileNameAtIndex)

        mailComposerVC.setMessageBody("", isHTML: false)
        return mailComposerVC
    }

Crash At - Line mailComposerVC.addAttachmentData(fileData! as Data, mimeType: "audio/mp4", fileName: self.audioFileNameAtIndex) 可能是由于你提供的错误路径 如果可能,我可以看到您使用什么方法来获取文档目录路径?您想要共享的文件位于主目录内的其他目录中

注意:只需使用以下几行来访问您的文件

let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]
let AudioFileNameToBeAdded = (documentsPath as NSString).appendingPathComponent(audioFileNameAtIndex)
let fileData = NSData(contentsOfFile: "/folderNameIfAny/\(audioFileNameAtIndex)")