🔨
Swift - MessageUIでアプリへの意見や不具合の報告を集める方法
作るもの
MessageUIを使ってアプリ内でユーザーがメールを送れる機能を実装します。
MessageUIを使うとメールを送ったユーザーのメールアドレスも自動で取得できるので、問い合わせに対して返信することもできます。
完成イメージ
送信者のメールアドレスが自動で入ります。
Simulatorでは使えません
完成コード
ViewController.swift
import UIKit
import MessageUI
class ViewController: UIViewController, MFMailComposeViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func buttonTapped(_ sender: UIButton) {
if MFMailComposeViewController.canSendMail() {
let mail = MFMailComposeViewController()
mail.mailComposeDelegate = self
mail.setToRecipients(["xxxxxx@gmail.com"])
mail.setSubject("お問い合わせ")
mail.setMessageBody("\n\n\n\n\nーーーーーーーーーーーーーーーー\nこの上にメッセージを入力してください。", isHTML: false)
present(mail, animated: true)
} else {
let alert = UIAlertController(title: "メールを送信できませんでした", message: "時間を置いてからもう一度お試しください。", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
if result == .sent {
let alert = UIAlertController(title: "メールを送信しました", message: "メールありがとう!", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
} else if result == .failed {
let alert = UIAlertController(title: "メールを送信できませんでした", message: "時間を置いてからもう一度お試しください。", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}
}
ポイント
メールの内容設定
mail.setToRecipients(["xxxxxx@gmail.com"])
mail.setSubject("お問い合わせ")
mail.setMessageBody("\n\n\n\n\nーーーーーーーーーーーーーーーー\nこの上にメッセージを入力してください。", isHTML: false
ここでメールの内容を設定しています。
個人的にMessageBodyは改行をいくらかしておいてユーザーが入力する部分を上に確保するのがおすすめです。
終了時の処理
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true)
if result == .sent {
let alert = UIAlertController(title: "メールを送信しました", message: "メールありがとう!", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
} else if result == .failed {
let alert = UIAlertController(title: "メールを送信できませんでした", message: "時間を置いてからもう一度お試しください。", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}
このメソッドがメール機能終了時に呼び出されます。
controller.dismiss(animated: true)
この記述をしないと送信ボタンやキャンセルボタンを押してもメール画面が閉じてくれません。
result: MFMailComposeResult
ここにメールを送信したのか、送信に失敗したのか、キャンセルしたのか、下書き保存したのかなど、結果の値が入ります。
結果に合わせてアプリの振る舞いを変えましょう。
参考記事
Discussion