【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

実際の処理の流れは以下のようになる

  1. canSendMailメソッドでメールの送信が可能か確認する
  2. MFMailComposeViewControllerクラスのインスタンスを生成
  3. delegate(CMFMailComposeViewControllerDelegate)を設定
  4. 必要に応じてメールの件名/宛先(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)
  }