MFMailComposeViewController发送和取消都无法使用



mfmailcomposeviewcontroller.cansendmail((是正确的,gmail屏幕上有正确的收件人电子邮件ID,主题和身体。但是发送按钮已禁用。另外,当我按CANCEL按钮滑块时,请提供两个选项:删除和取消。删除不起作用,我无法从邮件作曲家回到我以前的控制器。

gmail在我的iPhone上设置了,可以正常工作。我不知道有什么问题,有人可以帮忙吗?

MFMailComposeViewController.canSendMail() {
    if (selectedEntry!.notifyType == "Email") {
        let mailComposeVC = MFMailComposeViewController()
        mailComposeVC.mailComposeDelegate = self
        let target:String = (selectedEntry?.targetString)!
        mailComposeVC.setToRecipients([target])
        mailComposeVC.setSubject("Test")
        mailComposeVC.setMessageBody("Hello ", isHTML: false)
        // present the message view controller
        self.present(mailComposeVC, animated: true, completion: nil)
    }
} else {
    print("MAIL services are not available")
    return
}

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)
{
    switch (result)
    {
    case .sent:
        print("email sent.")
        break
    case .cancelled:
        print("email cancelled.")
        break
    case .failed:
        print("failed sending email")
        break
    default:
        break
    }
    controller.dismiss(animated: true, completion: nil)
}  

不幸的是,MFMailComposeViewController由本机邮件应用程序供电。取自Apple文档:

如果用户选择发送消息,则该消息在 用户的邮件应用程序发箱。邮件应用程序最终负责 发送消息。

由于设备上设置了Gmail帐户,即使从设备"卸载"邮件应用程序"卸载"即使canSendMail也将返回True。该应用程序并没有真正卸载,而是隐藏的。如果您尝试以以下方式检查该应用程序是否存在,您将获得误报。

let mailURL = URL(string: "mailto:?to=(emailAddress)")!
let canSendEmail = UIApplication.shared.canOpenURL(mailURL)

使用UIApplication.shared.open(mailURL)打开已验证的URL会提醒您是否想重新安装应用程序。

还原"邮件"?警报

根据此回应,此问题仅存在于iOS 12或更新中。

与Swift 5。

合作良好

首先,对发送电子邮件的viewController进行扩展:

import UIKit
import Foundation
import MessageUI
import LocalAuthentication
extension viewControllerThatSendsTheEmail: MFMailComposeViewControllerDelegate
{
  func mailComposeController( _ controller: MFMailComposeViewController, didFinishWith result:MFMailComposeResult, error: Error?)
   {
    if let _ = error
    {
        controller.dismiss(animated: true)
        return
    }
    switch result
    {
    case.cancelled:
        print("CANCELLED")
    case.failed:
        print("FAILED")
    case.saved:
        print("SAVED")
    case.sent:
        print("EMAIL SENT")
    @unknown default:
        fatalError()
    }
    controller.dismiss(animated: true)
  }
}

然后您的功能:

@objc func sendEmailButtonTap()
{
    guard MFMailComposeViewController.canSendMail()
        else
    {
        return
    }
    let sending = MFMailComposeViewController()
    sending.mailComposeDelegate = self
    sending.setToRecipients(["awesomeDeveloper@apple.com"])
    sending.setSubject("AWRSOME APP")
    sending.setMessageBody("THIS APP IS SO AWESOME!", isHTML: false)
    present(sending, animated: true)
}

最新更新