Ответ 1
Он не будет работать с симулятором. Пожалуйста, проверьте его на устройстве iPhone. Вы можете сослаться на Портал разработчиков Apple - MFMailComposeViewController
Я пытаюсь настроить приложение с отправкой электронной почты.
У меня есть этот код:
import Foundation
import MessageUI
import UIKit
class emailClass: UIViewController, MFMailComposeViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
if !MFMailComposeViewController.canSendMail() {
print("Mail services are not available")
return
}
sendEmail()
}
func sendEmail() {
let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = self
// Configure the fields of the interface.
composeVC.setToRecipients(["[email protected]"])
composeVC.setSubject("Hello!")
composeVC.setMessageBody("Hello this is my message body!", isHTML: false)
// Present the view controller modally.
self.present(composeVC, animated: true, completion: nil)
}
func mailComposeController(controller: MFMailComposeViewController,
didFinishWithResult result: MFMailComposeResult, error: NSError?) {
// Check the result or perform other tasks.
// Dismiss the mail compose view controller.
controller.dismiss(animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Итак, я получаю это сообщение: "Почтовые службы недоступны". Теперь я вошел в симулятор устройства в iCloud... Поэтому я думаю, что он должен это делать, но это не так. Почему это не работает? Можете ли вы сказать мне, что случилось, и как я могу двигаться вперед?
Он не будет работать с симулятором. Пожалуйста, проверьте его на устройстве iPhone. Вы можете сослаться на Портал разработчиков Apple - MFMailComposeViewController
Вот как я это сделал. Похоже, вы очень внимательно следили за документацией, я подумал, что добавлю свой вариант на случай, если он кому-нибудь поможет. Кроме того, он немного обновлен до текущего (август 2017 года) синтаксиса.
Соответствуйте протоколу MFMailComposeViewControllerDelegate и проверьте, может ли устройство отправлять почту.
import Foundation
import UIKit
import MessageUI
class WelcomeViewController: UIViewController, MFMailComposeViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
if !MFMailComposeViewController.canSendMail() {
print("Mail services are not available")
return
}
}
Мое приложение использует IBAction для инициации составления почты.
@IBAction func sendFeedbackButtonTapped(_ sender: Any) {
let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = self
// Configure the fields of the interface.
composeVC.setToRecipients(["[email protected]"])
composeVC.setSubject("Message Subject")
composeVC.setMessageBody("Message content.", isHTML: false)
// Present the view controller modally.
self.present(composeVC, animated: true, completion: nil)
}
О следующей функции mailComposeController говорится в документации
Контроллер представления почтовых сообщений не удаляется автоматически. Когда пользователь нажимает кнопки для отправки электронного письма или отмены интерфейса, контроллер представления почтового сообщения вызывает метод mailComposeController (_: didFinishWith: error :) своего делегата. Ваша реализация этого метода должна явно отклонить контроллер представления, как показано в листинге 3. Вы также можете использовать этот метод для проверки результата операции.
func mailComposeController(_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult, error: Error?) {
// Check the result or perform other tasks.
// Dismiss the mail compose view controller.
controller.dismiss(animated: true, completion: nil)
}
}
Код кажется хорошим и отлично работает, если приложение работает в реальном устройстве
MFMailComposeViewController.canSendMail() // returns false for simulators.
Вы не можете протестировать его на симуляторе, вы сможете протестировать основные вещи, такие как пользовательский интерфейс, как все происходит на нажатиях кнопки "Отмена/отправка".
Чтобы проверить, вам нужно использовать устройство, приложение Mail в устройстве должно быть настроено с помощью некоторой почты (например: [email protected]).
Надеюсь, что это поможет.
Проблема с вашим кодом заключается в том, что
//Показывать контроллер вида. self.present(composeVC, анимированный: true, завершение: ноль)
сам по себе представляет: -)
Если вы не знаете текущий контроллер, просто покажите его на RootViewController, т.е.
UIApplication.shared.keyWindow?.rootViewController?.present(...
В Swift 5 отправка электронной почты прекращается, вам нужно подтвердить и внедрить MFMailComposeViewControllerDelegate и проверить, можем ли мы отправлять электронную почту на это устройство.
Вот маленький кусочек кода, который я использовал для своей задачи
import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: IBAction Method for Button click
@IBAction func sendEmail(_ sender: Any) {
//TODO: You should chack if we can send email or not
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["[email protected]"])
mail.setSubject("Email Subject Here")
mail.setMessageBody("<p>You're so awesome!</p>", isHTML: true)
present(mail, animated: true)
} else {
print("Application is not able to send an email")
}
}
//MARK: MFMail Compose ViewController Delegate method
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
}
}
PS: пожалуйста, не забудьте, что вам нужно проверить это на реальном устройстве