Открытие электронной почты из приложения с предопределенным текстом в iOS
Здравствуйте я хочу открыть почтовую программу из моего приложения, и тело уже должно быть определено. Я могу открыть письмо, но не знаю, как определить тело письма в качестве заданного параметра для отображения заданного стандартного текста. Кто-нибудь может помочь? Вот код, который я использую для открытия электронной почты:
//EMAIL
let email = "foo@bar.com"
let urlEMail = NSURL(string: "mailto:(email)")
if UIApplication.sharedApplication().canOpenURL(urlEMail!) {
UIApplication.sharedApplication().openURL(urlEMail!)
} else {
print("Ups")
}
6 ответов:
Вы можете сделать это с помощью
MFMailComposeViewController
:let mailComposerVC = MFMailComposeViewController() mailComposerVC.mailComposeDelegate = self mailComposerVC.setToRecipients(["email@email.com"]) mailComposerVC.setSubject("Subject") mailComposerVC.setMessageBody("Body", isHTML: false) self.presentViewController(mailComposerVC, animated: true, completion: nil)
Кроме того, вам нужно реализовать
mailComposeController:didFinishWithResult:error:
изMFMailComposeViewControllerDelegate
, где вы должны отклонитьMFMailComposeViewController
Если вы хотите открыть встроенное приложение электронной почты, а не показывать
MFMailComposeViewController
, как было упомянуто другими, вы можете построить ссылкуmailto:
следующим образом:let subject = "My subject" let body = "The awesome body of my email." let encodedParams = "subject=\(subject)&body=\(body)".stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet()) let url = "mailto:foo@bar.com?\(encodedParams)" if let emailURL = NSURL(url) { if UIApplication.sharedApplication().canOpenURL(emailURL) { UIApplication.sharedApplication().openURL(emailURL) } }
Просто для того, чтобы сохранить любой ввод текста, в 2016 году синтаксис немного изменился:
let subject = "Some subject" let body = "Plenty of email body." let coded = "mailto:blah@blah.com?subject=\(subject)&body=\(body)".stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryAllowedCharacterSet()) if let emailURL:NSURL = NSURL(string: coded!) { if UIApplication.sharedApplication().canOpenURL(emailURL) { UIApplication.sharedApplication().openURL(emailURL) }
Swift 3 Версия
let subject = "Some subject" let body = "Plenty of email body." let coded = "mailto:blah@blah.com?subject=\(subject)&body=\(body)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) if let emailURL: NSURL = NSURL(string: coded!) { if UIApplication.shared.canOpenURL(emailURL as URL) { UIApplication.shared.openURL(emailURL as URL) } }
Используйте
MFMailComposeViewController
следующим образом:
Импорт сообщения
import MessageUI
Добавьте делегата в свой класс:
class myClass: UIViewController, MFMailComposeViewControllerDelegate {}
Настройте предустановку электронной почты, которую вы хотите иметь
let mail = MFMailComposeViewController() mail.mailComposeDelegate = self mail.setSubject("Subject") mail.setMessageBody("Body", isHTML: true) mail.setToRecipients(["my@email.com"]) presentViewController(mail, animated: true, completion: nil)
Поместите этот метод в свой код:
func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) { dismissViewControllerAnimated(true, completion: nil) }
Ну вот, теперь работает.
Swift 4.0
let email = "feedback@company.com" let subject = "subject" let bodyText = "Please provide information that will help us to serve you better" if MFMailComposeViewController.canSendMail() { let mailComposerVC = MFMailComposeViewController() mailComposerVC.mailComposeDelegate = self mailComposerVC.setToRecipients([email]) mailComposerVC.setSubject(subject) mailComposerVC.setMessageBody(bodyText, isHTML: true) self.present(mailComposerVC, animated: true, completion: nil) } else { let coded = "mailto:\(email)?subject=\(subject)&body=\(bodyText)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) if let emailURL = URL(string: coded!) { if UIApplication.shared.canOpenURL(emailURL) { UIApplication.shared.open(emailURL, options: [:], completionHandler: { (result) in if !result { // show some Toast or error alert //("Your device is not currently configured to send mail.") } }) } } }
Я предлагаю использовать способ Apple, который вы можете найти в официальной документации о MFMailComposeViewController. Он открывает контроллер модального вида с электронной почтой, которая отклоняется после отправки. Таким образом, пользователь остается в вашем приложении.