웹뷰에서 mailto: 태그로 되어있는 링크를 누르면 기본 메일 앱을 열어주려고 한다.
UIWebViewDelegate 프로토콜 메소드에서 링크 클릭 이벤트를 처리해주어야 한다.
링크가 mailto: 형식인 경우에 대한 처리를 구현해주면 된다.
mailto:abc@com
형태로 오기때문에 replacingOccurrences 메소드를 이용하여 "mailto:"를 제거하고 이메일 주소를 추출했다.
extension WebViewController: UIWebViewDelegate, MFMailComposeViewControllerDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if let url = navigationAction.request.url, url.scheme == "mailto" { // 'mailto:' 링크 클릭 이벤트 처리
let emailAddress = url.absoluteString.replacingOccurrences(of: "mailto:", with: "")
openMailCompose(emailAddress: emailAddress)
decisionHandler(.cancel)
} else {
decisionHandler(.allow)
}
}
}
MFMailComposeViewController 를 사용하여 기본 메일 앱을 열어주면 된다.
MFMailComposeViewController.canSendMail() 을 이용하여 기기에서 이메일을 보낼 수 있는지 여부를 판단한다.
가능하면 아까 위에서 추출한 이메일 주소를 수신자에 지정해준다.
이메일 보내기 기능을 지원하지 않는 기기일 경우 사용자에게 UIAlertController 을 이용해 간단하게 알림창을 띄워주도록 구현했다.
사용자가 이메일을 보내거나 인터페이스를 취소하기 위해 버튼을 탭하면 메일 작성 뷰 컨트롤러가 닫히도록 mailComposeController 구현.
import MessageUI
// 이메일 작성 화면 표시
func openMailCompose(emailAddress: String) {
if MFMailComposeViewController.canSendMail() {
let mailComposeVC = MFMailComposeViewController()
mailComposeVC.mailComposeDelegate = self
mailComposeVC.setToRecipients([emailAddress])
present(mailComposeVC, animated: true, completion: nil)
} else {
// 이 기기에서는 이메일 보내기 기능을 지원하지 않음
let alertController = UIAlertController(title: "알림", message: "이 기기에서는 이메일 보내기 기능을 지원하지 않습니다.", preferredStyle: .alert)
let okayAction = UIAlertAction(title: "확인", style: .default, handler: nil)
alertController.addAction(okayAction)
present(alertController, animated: true, completion: nil)
}
}
// 메일 작성 완료 후 호출
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true, completion: nil)
}
🚨 구현해줬는데 링크를 클릭해도 아무런 반응이 없었다.
웹뷰 컨트롤러에서 WKNavigationDelegate 설정해주는 걸 빼먹었었다 ㅠ
웹페이지 로딩상황을 추적하거나 콘텐츠나 사용자의 액션을 제어할 수 있도록 델리게이트 설정해주는걸 잊지말자
webView.navigationDelegate = self
참고 : https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontrollerdelegate
https://developer.apple.com/forums/thread/90374