[iOS/Swift] WKWebView mailto: 태그 메일 보내기 기능 (기본 메일 앱 열기)

SoyoungLee·2023년 8월 23일
0

iOS/스위프트

목록 보기
4/6

💌 [iOS/Swift] WKWebView mailto: 태그 메일 보내기 기능 (기본 메일 앱 열기)

웹뷰에서 mailto: 태그로 되어있는 링크를 누르면 기본 메일 앱을 열어주려고 한다.

📌 UIWebViewDelegate

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)
        }
    }
}

📌 MFMailComposeViewControllerDelegate

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

profile
Android Developer..+ iOS 슬쩍 🌱 ✏️끄적끄적,,개인 기록용 👩🏻‍💻

0개의 댓글