🔨

Swift - MessageUIでアプリへの意見や不具合の報告を集める方法

2022/05/18に公開

作るもの

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

ここにメールを送信したのか、送信に失敗したのか、キャンセルしたのか、下書き保存したのかなど、結果の値が入ります。
結果に合わせてアプリの振る舞いを変えましょう。

参考記事

https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontroller

Discussion