【swift】アプリ内でmailerを立ち上げてーバグリポート機能の実装【CoffeeNote開発記録】
参考にさせていただいたサイト
MFMailComposeViewController Class Reference
アプリから画像を添付してメールを送信する方法 | CrossBridge
MFMailComposeViewController - Send email in your apps
準備
プロジェクトのターゲットのところから、MessageUI.frameworkをプロジェクトに追加する。
MessageUIをimportして、MFMailComposeViewControllerDelegateを追加。
import MessageUI class SettingViewController: UIViewController, MFMailComposeViewControllerDelegate { // 省略 }
コーディング
そしたらMFMailComposerViewControllerクラスのメソッドを使ってメールを送る処理を書いていく。
メソッド一覧は以下。
MFMailComposeViewController Class Reference
実際の処理の流れは以下のようになる
- canSendMailメソッドでメールの送信が可能か確認する
- MFMailComposeViewControllerクラスのインスタンスを生成
- delegate(CMFMailComposeViewControllerDelegate)を設定
- 必要に応じてメールの件名/宛先(TO,CC,BCC)/添付ファイル/本文を設定する モーダルでビューを表示する
ソースは以下
@IBAction func reportButtonPushed(sender: AnyObject) { // check if can send an email if MFMailComposeViewController.canSendMail()==false { println("Email Send Failed") return } var mailViewController = MFMailComposeViewController() mailViewController.mailComposeDelegate = self mailViewController.setSubject("Bug Report") var toRecipients = ["yuta.totz@gmail.com"] mailViewController.setToRecipients(toRecipients) mailViewController.setMessageBody("", isHTML: false) self.presentViewController(mailViewController, animated: true, completion: nil) }
このままだと表示されたメールの画面が閉じないので、閉じる処理を書いていく
メールのアプリを送信完了/失敗するか、キャンセルボタンが押されるとdidFinishWithResult
メソッドが呼ばれるのでこれを利用する。
switch文でMFMailComposeResultSaved
とかを使うときにエラーがでたが、以下の記事で解決。
switch statement - Sending emails - MFMailComposeResult - Stack Overflow
こんな感じ。
func mailComposeController(controller: MFMailComposeViewController!, didFinishWithResult result: MFMailComposeResult, error: NSError!) { switch result.value { case MFMailComposeResultCancelled.value: println("Email Send Cancelled") break case MFMailComposeResultSaved.value: println("Email Saved as a Draft") break case MFMailComposeResultSent.value: println("Email Sent Successfully") break case MFMailComposeResultFailed.value: println("Email Send Failed") break default: break } self.dismissViewControllerAnimated(true, completion: nil) }