ฉันกำลังทำงานกับแอปพลิเคชันที่รวดเร็วที่ผู้ใช้ป้อนที่อยู่อีเมลและกดปุ่มเพื่อเปิดแอปอีเมลพร้อมที่อยู่ที่ป้อนในแถบที่อยู่ ฉันรู้วิธีทำใน Objective-C แต่ฉันมีปัญหาในการทำให้มันทำงานใน Swift
ฉันกำลังทำงานกับแอปพลิเคชันที่รวดเร็วที่ผู้ใช้ป้อนที่อยู่อีเมลและกดปุ่มเพื่อเปิดแอปอีเมลพร้อมที่อยู่ที่ป้อนในแถบที่อยู่ ฉันรู้วิธีทำใน Objective-C แต่ฉันมีปัญหาในการทำให้มันทำงานใน Swift
คำตอบ:
คุณสามารถใช้ลิงก์ mailto: ง่ายๆใน iOS เพื่อเปิดแอปเมล
let email = "foo@bar.com"
if let url = URL(string: "mailto:\(email)") {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url)
} else {
UIApplication.shared.openURL(url)
}
}
แม้ว่าคำตอบอื่น ๆ จะถูกต้อง แต่คุณไม่มีทางรู้ได้ว่า iPhone / iPad ที่ใช้งานแอปพลิเคชันของคุณติดตั้งแอป Mail ของ Apple ไว้หรือไม่เนื่องจากผู้ใช้สามารถลบได้
จะดีกว่าในการรองรับไคลเอนต์อีเมลหลายตัว รหัสต่อไปนี้จะจัดการกับการส่งอีเมลด้วยวิธีที่สละสลวยยิ่งขึ้น ขั้นตอนของรหัสคือ:
mailto:..
ที่แจ้งให้ผู้ใช้ติดตั้งแอพเมลของ Appleรหัสเขียนด้วยSwift 5 :
import MessageUI
import UIKit
class SendEmailViewController: UIViewController, MFMailComposeViewControllerDelegate {
@IBAction func sendEmail(_ sender: UIButton) {
// Modify following variables with your text / recipient
let recipientEmail = "test@email.com"
let subject = "Multi client email support"
let body = "This code supports sending email via multiple different email apps on iOS! :)"
// Show default mail composer
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients([recipientEmail])
mail.setSubject(subject)
mail.setMessageBody(body, isHTML: false)
present(mail, animated: true)
// Show third party email composer if default Mail app is not present
} else if let emailUrl = createEmailUrl(to: recipientEmail, subject: subject, body: body) {
UIApplication.shared.open(emailUrl)
}
}
private func createEmailUrl(to: String, subject: String, body: String) -> URL? {
let subjectEncoded = subject.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
let bodyEncoded = body.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
let gmailUrl = URL(string: "googlegmail://co?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
let outlookUrl = URL(string: "ms-outlook://compose?to=\(to)&subject=\(subjectEncoded)")
let yahooMail = URL(string: "ymail://mail/compose?to=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
let sparkUrl = URL(string: "readdle-spark://compose?recipient=\(to)&subject=\(subjectEncoded)&body=\(bodyEncoded)")
let defaultUrl = URL(string: "mailto:\(to)?subject=\(subjectEncoded)&body=\(bodyEncoded)")
if let gmailUrl = gmailUrl, UIApplication.shared.canOpenURL(gmailUrl) {
return gmailUrl
} else if let outlookUrl = outlookUrl, UIApplication.shared.canOpenURL(outlookUrl) {
return outlookUrl
} else if let yahooMail = yahooMail, UIApplication.shared.canOpenURL(yahooMail) {
return yahooMail
} else if let sparkUrl = sparkUrl, UIApplication.shared.canOpenURL(sparkUrl) {
return sparkUrl
}
return defaultUrl
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
}
}
โปรดทราบว่าฉันพลาดเนื้อหาสำหรับแอป Outlook โดยเจตนาเนื่องจากไม่สามารถแยกวิเคราะห์ได้
คุณยังต้องเพิ่มโค้ดต่อไปนี้ในInfo.plist
ไฟล์ที่อนุญาตพิเศษของโครงร่างแบบสอบถาม URl ที่ใช้
<key>LSApplicationQueriesSchemes</key>
<array>
<string>googlegmail</string>
<string>ms-outlook</string>
<string>readdle-spark</string>
<string>ymail</string>
</array>
isHTML
ในโค้ดด้านบนเป็น true สำหรับไคลเอนต์อื่นดูเหมือนว่าจะเป็นไปไม่ได้สำหรับการอ่านเพิ่มเติมโปรดดูstackoverflow.com/questions/5620324/mailto-link-with-html-body
ฉันไม่แน่ใจว่าคุณต้องการเปลี่ยนไปใช้แอปอีเมลเองหรือเพียงแค่เปิดและส่งอีเมล สำหรับตัวเลือกหลังที่เชื่อมโยงกับปุ่ม IBAction:
import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
@IBAction func launchEmail(sender: AnyObject) {
var emailTitle = "Feedback"
var messageBody = "Feature request or bug report?"
var toRecipents = ["friend@stackoverflow.com"]
var mc: MFMailComposeViewController = MFMailComposeViewController()
mc.mailComposeDelegate = self
mc.setSubject(emailTitle)
mc.setMessageBody(messageBody, isHTML: false)
mc.setToRecipients(toRecipents)
self.presentViewController(mc, animated: true, completion: nil)
}
func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {
switch result {
case MFMailComposeResultCancelled:
print("Mail cancelled")
case MFMailComposeResultSaved:
print("Mail saved")
case MFMailComposeResultSent:
print("Mail sent")
case MFMailComposeResultFailed:
print("Mail sent failure: \(error?.localizedDescription)")
default:
break
}
self.dismissViewControllerAnimated(true, completion: nil)
}
}
class myClass: UIViewController, MFMailComposeViewControllerDelegate {
'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target
. แอพขัดข้องในบางอุปกรณ์ (iPhone 5, iPhone 6 และ iPad Mini)
ใน Swift 3 คุณต้องแน่ใจว่าได้เพิ่มimport MessageUI
และต้องเป็นไปตามMFMailComposeViewControllerDelegate
โปรโตคอล
func sendEmail() {
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["ved.ios@yopmail.com"])
mail.setMessageBody("<p>You're so awesome!</p>", isHTML: true)
present(mail, animated: true)
} else {
// show failure alert
}
}
มาตรการ:
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
}
สำหรับ Swift 4.2+ และ iOS 9+
let appURL = URL(string: "mailto:TEST@EXAMPLE.COM")!
if #available(iOS 10.0, *) {
UIApplication.shared.open(appURL, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(appURL)
}
แทนที่ TEST@EXAMPLE.COM ด้วยที่อยู่อีเมลที่คุณต้องการ
Swift 2 พร้อมการตรวจสอบความพร้อมใช้งาน :
import MessageUI
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["test@test.test"])
mail.setSubject("Bla")
mail.setMessageBody("<b>Blabla</b>", isHTML: true)
presentViewController(mail, animated: true, completion: nil)
} else {
print("Cannot send mail")
// give feedback to the user
}
// MARK: - MFMailComposeViewControllerDelegate
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
switch result.rawValue {
case MFMailComposeResultCancelled.rawValue:
print("Cancelled")
case MFMailComposeResultSaved.rawValue:
print("Saved")
case MFMailComposeResultSent.rawValue:
print("Sent")
case MFMailComposeResultFailed.rawValue:
print("Error: \(error?.localizedDescription)")
default:
break
}
controller.dismissViewControllerAnimated(true, completion: nil)
}
ลักษณะของ Swift 4 มีดังนี้:
import MessageUI
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["test@test.test"])
mail.setSubject("Bla")
mail.setMessageBody("<b>Blabla</b>", isHTML: true)
present(mail, animated: true, completion: nil)
} else {
print("Cannot send mail")
// give feedback to the user
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
switch result.rawValue {
case MFMailComposeResult.cancelled.rawValue:
print("Cancelled")
case MFMailComposeResult.saved.rawValue:
print("Saved")
case MFMailComposeResult.sent.rawValue:
print("Sent")
case MFMailComposeResult.failed.rawValue:
print("Error: \(String(describing: error?.localizedDescription))")
default:
break
}
controller.dismiss(animated: true, completion: nil)
}
อัปเดตคำตอบจาก Stephen Groom สำหรับ Swift 3
let email = "email@email.com"
let url = URL(string: "mailto:\(email)")
UIApplication.shared.openURL(url!)
นี่คือการอัปเดตสำหรับ Swift 4 หากคุณต้องการเปิดโปรแกรมรับส่งเมลผ่านทางURL
:
let email = "foo@bar.com"
if let url = URL(string: "mailto:\(email)") {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
สิ่งนี้ใช้ได้ดีสำหรับฉัน :)
นี่เป็นการแก้ปัญหาแบบตรงไปตรงมาของ 3 ขั้นตอนใน Swift
import MessageUI
เพิ่มเพื่อให้สอดคล้องกับ Delegate
MFMailComposeViewControllerDelegate
และสร้างวิธีการของคุณ:
func sendEmail() {
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["support@mail.com"])
mail.setSubject("Support App")
mail.setMessageBody("<p>Send us your issue!</p>", isHTML: true)
presentViewController(mail, animated: true, completion: nil)
} else {
// show failure alert
}
}
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
controller.dismissViewControllerAnimated(true, completion: nil)
}
คุณควรลองส่งด้วยตัวเขียนอีเมลในตัวและหากล้มเหลวให้ลองใช้การแชร์:
func contactUs() {
let email = "info@example.com" // insert your email here
let subject = "your subject goes here"
let bodyText = "your body text goes here"
// https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontroller
if MFMailComposeViewController.canSendMail() {
let mailComposerVC = MFMailComposeViewController()
mailComposerVC.mailComposeDelegate = self as? MFMailComposeViewControllerDelegate
mailComposerVC.setToRecipients([email])
mailComposerVC.setSubject(subject)
mailComposerVC.setMessageBody(bodyText, isHTML: false)
self.present(mailComposerVC, animated: true, completion: nil)
} else {
print("Device not configured to send emails, trying with share ...")
let coded = "mailto:\(email)?subject=\(subject)&body=\(bodyText)".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
if let emailURL = URL(string: coded!) {
if #available(iOS 10.0, *) {
if UIApplication.shared.canOpenURL(emailURL) {
UIApplication.shared.open(emailURL, options: [:], completionHandler: { (result) in
if !result {
print("Unable to send email.")
}
})
}
}
else {
UIApplication.shared.openURL(emailURL as URL)
}
}
}
}
@IBAction func launchEmail(sender: AnyObject) {
if if MFMailComposeViewController.canSendMail() {
var emailTitle = "Feedback"
var messageBody = "Feature request or bug report?"
var toRecipents = ["friend@stackoverflow.com"]
var mc: MFMailComposeViewController = MFMailComposeViewController()
mc.mailComposeDelegate = self
mc.setSubject(emailTitle)
mc.setMessageBody(messageBody, isHTML: false)
mc.setToRecipients(toRecipents)
self.present(mc, animated: true, completion: nil)
} else {
// show failure alert
}
}
func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) {
switch result {
case .cancelled:
print("Mail cancelled")
case .saved:
print("Mail saved")
case .sent:
print("Mail sent")
case .failed:
print("Mail sent failure: \(error?.localizedDescription)")
default:
break
}
self.dismiss(animated: true, completion: nil)
}
โปรดทราบว่าผู้ใช้บางคนไม่ได้กำหนดค่าอุปกรณ์ให้ส่งอีเมลดังนั้นเราจึงต้องตรวจสอบผลลัพธ์ของ canSendMail () ก่อนที่จะพยายามส่ง โปรดทราบว่าคุณต้องตรวจจับ didFinishWith callback เพื่อปิดหน้าต่างเมล
ในตัวควบคุมมุมมองจากตำแหน่งที่คุณต้องการให้แอปอีเมลของคุณเปิดขึ้นเมื่อแตะ
ใส่ฟังก์ชันนี้ไว้ในตัวควบคุมของคุณ
func showMailComposer(){
guard MFMailComposeViewController.canSendMail() else {
return
}
let composer = MFMailComposeViewController()
composer.mailComposeDelegate = self
composer.setToRecipients(["abc@gmail.com"]) // email id of the recipient
composer.setSubject("testing!!!")
composer.setMessageBody("this is a test mail.", isHTML: false)
present(composer, animated: true, completion: nil)
}
ขยายดูควบคุมของคุณและสอดคล้องกับMFMailComposeViewControllerDelegate
ใช้วิธีนี้และจัดการกับความล้มเหลวในการส่งอีเมลของคุณ
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
if let _ = error {
controller.dismiss(animated: true, completion: nil)
return
}
controller.dismiss(animated: true, completion: nil)
}
สำหรับพวกเราที่ยังล้าหลังใน Swift 2.3 นี่คือคำตอบของ Gordon ในไวยากรณ์ของเรา:
let email = "foo@bar.com"
if let url = NSURL(string: "mailto:\(email)") {
UIApplication.sharedApplication().openURL(url)
}
สำหรับ Swift 4.2 ขึ้นไป
let supportEmail = "abc@xyz.com"
if let emailURL = URL(string: "mailto:\(supportEmail)"), UIApplication.shared.canOpenURL(emailURL)
{
UIApplication.shared.open(emailURL, options: [:], completionHandler: nil)
}
ให้ผู้ใช้เลือกตัวเลือกเมลมากมาย (เช่น iCloud, google, yahoo, Outlook.com - หากไม่มีการกำหนดค่าเมลไว้ล่วงหน้าในโทรศัพท์) เพื่อส่งอีเมล