MFMailComposeViewController не отправляет электронную почту или не вызывает делегата (MFMailComposeViewControllerDelegate) - PullRequest
0 голосов
/ 01 июня 2018

У меня есть настройка MFMailComposeViewController, и она выглядит так:

class MyViewController: UIViewController {

    // MARK: - Properties
    let composeViewController = MFMailComposeViewController()

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {
        composeViewController.mailComposeDelegate = self
        composeViewController.setToRecipients([Constants.contactRecipientEmail])
        composeViewController.setSubject(Constants.contactSubject)
        composeViewController.setMessageBody(Constans.body, isHTML: false)
        present(composeViewController, animated: true, completion: nil)
    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
    private func mailComposeController(_ controller: MFMailComposeViewController,
                                       didFinishWith result: MFMailComposeResult,
                                       error: Error?) {
        switch result {
        case .sent:
            print("Email sent")
        case .saved:
            print("Draft saved")
        case .cancelled:
            print("Email cancelled")
        case  .failed:
            print("Email failed")
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

У меня возникла эта проблема:

  1. После нажатия «Отправить» на композиторе MFMailComposeViewControllerDelegateНЕ вызываться.

Чего мне не хватает?

Я не могу объявить mailComposeController как public:

enter image description here

enter image description here

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Недавно я столкнулся с аналогичной проблемой, моя работа заключается в том, чтобы я переместил объявление внутри действия кнопки

class MyViewController: UIViewController {

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {
        let composeViewController = MFMailComposeViewController()
        composeViewController.mailComposeDelegate = self
        composeViewController.setToRecipients([Constants.contactRecipientEmail])
        composeViewController.setSubject(Constants.contactSubject)
        composeViewController.setMessageBody(Constans.body, isHTML: false)
        present(composeViewController, animated: true, completion: nil)
    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
   func mailComposeController(_ controller: MFMailComposeViewController,
                                       didFinishWith result: MFMailComposeResult,
                                       error: Error?) {
        switch result {
        case .sent:
            print("Email sent")
        case .saved:
            print("Draft saved")
        case .cancelled:
            print("Email cancelled")
        case  .failed:
            print("Email failed")
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

Также вам не нужно делать метод делегата закрытым

0 голосов
/ 04 июня 2018

Я не знаю, где ваша проблема

я тестирую ваш код, он работает хорошо, компилятор не заставляет меня устанавливать делегата как приватный , Примечание.simulator только на device

import UIKit
import MessageUI
class MyViewController: UIViewController {

    // MARK: - Properties
    let composeViewController = MFMailComposeViewController()

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {

        if MFMailComposeViewController.canSendMail() {
            composeViewController.mailComposeDelegate = self
            composeViewController.setToRecipients(["abdela7ad@gmail.com"])
            composeViewController.setSubject("Constants.contactSubjec")
            composeViewController.setMessageBody("Constans.body", isHTML: false)
            present(composeViewController, animated: true, completion: nil)        } else {
        }

    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {

            switch result {
            case .sent:
                print("Email sent")
            case .saved:
                print("Draft saved")
            case .cancelled:
                print("Email cancelled")
            case  .failed:
                print("Email failed")
            }
            controller.dismiss(animated: true, completion: nil)
    }
}
0 голосов
/ 05 июня 2018

Несколько незначительных изменений, которые я выделю в комментариях:

import UIKit
import MessageUI

class MyViewController: UIViewController {

    // MARK: - Properties
    let composeViewController = MFMailComposeViewController()

    // MARK: - Actions
    @IBAction func didTapSendInEmailButton() {
        composeViewController.mailComposeDelegate = self
        // Entered a generic email in place of your constant value
        composeViewController.setToRecipients(["someone@example.com"])
        // Entered a generic subject in place of your constant value
        composeViewController.setSubject("subject")
        // You have a typo on "Constants" here
        composeViewController.setMessageBody("body", isHTML: false)
        present(composeViewController, animated: true, completion: nil)
    }
}

// MARK: - MFMailComposeViewControllerDelegate
extension MyViewController: MFMailComposeViewControllerDelegate {
    // Removed the private
    func mailComposeController(_ controller: MFMailComposeViewController,
                               didFinishWith result: MFMailComposeResult,
                               error: Error?) {
        switch result {
        case .sent:
            print("Email sent")
        case .saved:
            print("Draft saved")
        case .cancelled:
            print("Email cancelled")
        case  .failed:
            print("Email failed")
        }
        controller.dismiss(animated: true, completion: nil)
    }
}

И мой журнал консоли показывает электронное письмо отправлено .

Подтвердили ли вы, что ваш объект Константысодержит действительные данные?Возможно, вам следует распечатать его или просмотреть в точке останова, когда он прибудет сюда, чтобы убедиться в отсутствии проблем с его содержимым.

Кроме того, убедитесь, что на первом устройстве в вашем устройстве установлена ​​действующая учетная запись электронной почты.место, чтобы отправить письмо для вас.Если это устройство разработки, то оно может быть сброшено и в какой-то момент потеряно.

Сравнение типа ошибки в вашем: enter image description here

Для моего:enter image description here

Обратите внимание, что цвет Error меняется.Это означает, что он использует определенную вами ошибку, которая относится к частной.Вы должны сломать это, переименовав свою ошибку в другое.Как только это будет сделано, это должно исправить вашу ошибку.

0 голосов
/ 04 июня 2018
extension MyViewController: MFMailComposeViewControllerDelegate {
    private func mailComposeController(_ controller: MFMailComposeViewController,
                                       didFinishWith result: MFMailComposeResult,
                                       error: Error?)

Проверьте ваш метод делегата снова, это должно быть public.

Также убедитесь, что ваша учетная запись почты настроена правильно.

...