일모도원(日暮途遠) 개발자
[iOS오류수정] Mail뷰가 안 닫히는 버그 수정 본문
반응형
메일을 보내거나 취소를 해도 아래 메일뷰가 계속 떠있는 버그가 있었다.
아래처럼 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된다.
반응형
'iOS개발 > 오류수정' 카테고리의 다른 글
[iOS오류수정] Thread 1: EXC_BREAKPOINT (code=1, subcode=0x10ab991d8) (0) | 2022.12.08 |
---|---|
[iOS오류수정] Cannot call value of non-function type 'Bool' (0) | 2022.12.08 |
[iOS오류수정]Your app may use Audio in background mode. (0) | 2022.09.02 |
[XCode] Missing Purpose String in Info.plist : NSCameraUsageDescription 에러 (0) | 2022.08.08 |
[XCode] BGTaskSchedulerPermittedIdentifiers (0) | 2022.08.07 |