iOS 기기에서 Mail 앱으로 메일을 전송하는 방법에 대해서 알아보자. 보통 이 기능은 앱 내에서 사용자가 개발자에게 피드백, 문의, 의견 등을 메일로 보낼 때 사용될 수 있다.
⚠️ 주의사항
- 시뮬레이터에서는 Mail 앱이 실행되지 않으므로 실기기로 테스트한다.
- iOS 기기에 Mail 계정이 연동되어 있어야 메일이 전송된다.
(설정 → Mail → 계정 → 계정 연동 확인)
iOS에서 이메일을 보내기 위해서는 MessageUI를 사용한다.
import MessageUI
그 다음 if 문으로 메일을 보낼 수 있는지 확인한다. 메일을 보낼 수 있다면 메일 작성 화면을 띄워줄 것이고, 메일을 보낼 수 없다면 Alert 창을 띄울 것이다.
메일 작성 창(MFMailComposeViewController)에 3가지 값을 입력해야한다.
setToRecipients 에는 해당 메일을 전달 받을 이메일 주소를,
setSubject 에는 메일 제목을,
setMessageBody 에는 메일 내용을 작성한다.
@IBAction func commentsButtonTapped(_ sender: UIButton) {
if MFMailComposeViewController.canSendMail() {
let composeViewController = MFMailComposeViewController()
composeViewController.mailComposeDelegate = self
let bodyString = """
이곳에 내용을 작성해주세요.
오타 발견 문의 시 아래 양식에 맞춰 작성해주세요.
<예시>
글귀 ID : 글귀 4 (글귀 클릭 시 상단에 표시)
수정 전 : 실수해도 되.
수정 후 : 실수해도 돼.
-------------------
Device Model : \(self.getDeviceIdentifier())
Device OS : \(UIDevice.current.systemVersion)
App Version : \(self.getCurrentVersion())
-------------------
"""
composeViewController.setToRecipients(["modakyi.help@gmail.com"])
composeViewController.setSubject("<모닥이> 문의 및 의견")
composeViewController.setMessageBody(bodyString, isHTML: false)
self.present(composeViewController, animated: true, completion: nil)
} else {
print("메일 보내기 실패")
let sendMailErrorAlert = UIAlertController(title: "메일 전송 실패", message: "메일을 보내려면 'Mail' 앱이 필요합니다. App Store에서 해당 앱을 복원하거나 이메일 설정을 확인하고 다시 시도해주세요.", preferredStyle: .alert)
let goAppStoreAction = UIAlertAction(title: "App Store로 이동하기", style: .default) { _ in
// 앱스토어로 이동하기(Mail)
if let url = URL(string: "https://apps.apple.com/kr/app/mail/id1108187098"), UIApplication.shared.canOpenURL(url) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(url)
}
}
}
let cancleAction = UIAlertAction(title: "취소", style: .destructive, handler: nil)
sendMailErrorAlert.addAction(goAppStoreAction)
sendMailErrorAlert.addAction(cancleAction)
self.present(sendMailErrorAlert, animated: true, completion: nil)
}
}
그리고 나서 MFMailComposeViewControllerDelegate의 didFinishWith 메서드를 이용하여 메일을 보냈으면 메일 작성 창을 dismiss 한다.
extension SettingViewController: MFMailComposeViewControllerDelegate {
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
self.dismiss(animated: true, completion: nil)
}
}
메일 내용(bodyString)에서 아래와 같은 부분이 있는데, 차례대로 기기의 모델명, OS 버전, 앱 버전을 가져온다.
Device Model : \(self.getDeviceIdentifier()) Device OS : \(UIDevice.current.systemVersion) App Version : \(self.getCurrentVersion())
// Device Identifier 찾기
func getDeviceIdentifier() -> String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
return identifier
}
// 현재 버전 가져오기
func getCurrentVersion() -> String {
guard let dictionary = Bundle.main.infoDictionary,
let version = dictionary["CFBundleShortVersionString"] as? String else { return "" }
return version
}
💙 참고한 블로그 💙
https://borabong.tistory.com/6
https://khstar.tistory.com/entry/Swift-Device-Model-이름-가져오기
https://devmjun.github.io/archive/Version_Vs_Build