[iOS | Swift] iOS 기기에서 Mail 앱 이용해서 메일 보내는 방법

Minji Kim·2021년 12월 19일
0

iOS | Swift

목록 보기
4/13
post-thumbnail
post-custom-banner

iOS 기기에서 Mail 앱으로 메일을 전송하는 방법에 대해서 알아보자. 보통 이 기능은 앱 내에서 사용자가 개발자에게 피드백, 문의, 의견 등을 메일로 보낼 때 사용될 수 있다.

⚠️ 주의사항

  • 시뮬레이터에서는 Mail 앱이 실행되지 않으므로 실기기로 테스트한다.
  • iOS 기기에 Mail 계정이 연동되어 있어야 메일이 전송된다.
    (설정 → Mail → 계정 → 계정 연동 확인)

MessageUI 이용하기

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

profile
iOS Developer
post-custom-banner

0개의 댓글