MFMailComposeViewController无法显示国际化邮箱收件人问题咨询
解决方案
你遇到的问题本质是MFMailComposeViewController的setToRecipients方法原生不支持直接传入未编码的国际化非ASCII邮箱,而手动构造mailto链接跳转又丢失了组件自带的错误处理、状态回调能力,可以用官方提供的URL初始化方式解决:
实现代码
import MessageUI // 1. 构造mailto链接,用URLComponents自动处理非ASCII编码 let targetEmail = "eai-testé@domain.tld" var components = URLComponents() components.scheme = "mailto" components.path = targetEmail // 可选:添加主题、正文等其他参数 components.queryItems = [ URLQueryItem(name: "subject", value: "邮件主题"), URLQueryItem(name: "body", value: "邮件正文内容") ] // 2. 安全校验后初始化MFMailComposeViewController guard let mailtoURL = components.url, MFMailComposeViewController.canSendMail(), let picker = MFMailComposeViewController(url: mailtoURL) else { // 处理无法发送邮件的异常场景 return } // 3. 正常配置其他属性,保留原有能力 picker.mailComposeDelegate = self // 仍可调用setToRecipients、setCcRecipients等方法添加更多地址 present(picker, animated: true)
说明
- 该方案完全遵循苹果官方接口规范,
URLComponents会自动按照mailto协议标准处理非ASCII字符的编码,传入组件后会自动解码为正常显示的邮箱地址,和手动在原生邮件APP输入效果一致 - 完整保留
MFMailComposeViewController的所有能力,包括发送状态回调、错误拦截、附件添加、自定义界面配置等,无需跳转外部应用 - 全程用可选绑定处理异常,避免了手动百分编码强制解包的崩溃风险
内容的提问来源于stack exchange,提问作者Guillaume Blanchet
相关产品推荐
相关产品推荐

