일모도원(日暮途遠) 개발자

[iOS오류수정] Mail뷰가 안 닫히는 버그 수정 본문

iOS개발/오류수정

[iOS오류수정] Mail뷰가 안 닫히는 버그 수정

달님개발자 2022. 10. 7. 00:45
반응형

메일을 보내거나 취소를 해도 아래 메일뷰가 계속 떠있는 버그가 있었다.

아래처럼 MailHelper().sendEmail(vc)를 하니까 위의 버그가 생겨서


extension SideNavigationPresenter: ViewOutputs {
    func getView() -> DALViewController {
        return view as! DALViewController
    }
    func executeAction(type: ActionType, sender: AnyObject?, data: AnyObject?) {
        switch type {
        case .MAIL:
            let vc = getView()
            MailHelper().sendEmail(vc)

 

아래처럼 mailHelper를 변수로 따로 빼서 하니까 버그가 수정되었다

왜 수정되었는지는 모르겠다. -_-

 

final class SideNavigationPresenter: Presenterable {
    let mailerHelper = MailHelper()
}
extension SideNavigationPresenter: ViewOutputs {
    func getView() -> DALViewController {
        return view as! DALViewController
    }
    func executeAction(type: ActionType, sender: AnyObject?, data: AnyObject?) {
        switch type {
        case .MAIL:
            let vc = getView()
            mailerHelper.sendEmail(vc)

 

MailHelper클래스

import UIKit
import MessageUI

final class MailHelper: NSObject, MFMailComposeViewControllerDelegate {
    func sendEmail(_ vc: UIViewController) {
        // Modify following variables with your text / recipient
        let recipientEmail = "araonesoft@gmail.com"
        let subject = "MAIL.SUBJECT".localized()
        let appInfo = AppInfo()
        let body = "\("MAIL.BODY".localized())\n\n\(appInfo.appName)\n\(appInfo.deviceType)\n\(appInfo.deviceOsVersion)\n"
        // Show default mail composer
        if MFMailComposeViewController.canSendMail() {
            let mail = MFMailComposeViewController()
            mail.mailComposeDelegate = self
            mail.setToRecipients([recipientEmail])
            mail.setSubject(subject)
            mail.setMessageBody(body, isHTML: false)
            
            vc.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: .urlQueryAllowed)!
        let bodyEncoded = body.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
        
        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?) {
        if let err = error {
            logFor.ELog(message: "\(err.localizedDescription)")
        }
        controller.dismiss(animated: true)
    }
}

 

버그가 수정되면 아래처럼 mailComposeController가 정상적으로 호출되고 메일뷰가 dismiss된다.

 

반응형