開発環境 Xcode9.4 / Swift4.1
以下のような、加速度センサで測定した値を配列に格納し、CSVファイルに変換し、メールに添付して送信するプログラムを作成しました。しかし、便宜上、CSVファイルを直接OneDriveに保存するように改善できないかと考えています。
調べたところ、こちらや、こちらのようにUIDocumentInteractionControllerやUIActivityViewControllerを使ってできそうだとは思ったのですが、CSVファイルの場合は具体的にどのようにコードを書いていけばいいのかわからない状態です。ご教示頂けますでしょうか。参考になるサイトやコードの一部だけでも教えていただければ幸いです。
swift
1import UIKit 2import MessageUI 3import CoreMotion 4 5class ViewController: UIViewController, MFMailComposeViewControllerDelegate { 6 7 @IBOutlet weak var xGyroLabel: UILabel! 8 @IBOutlet weak var yGyroLabel: UILabel! 9 @IBOutlet weak var zGyroLabel: UILabel! 10 11 let cmManager = CMMotionManager() 12 var csvData=[[String]]() //空の配列の定義 13 var dt=0.1 //ジャイロ取得時間間隔[s] 14 15 @IBAction func tapStart(_ sender: Any) { 16 17 // キューを実行する間隔(秒数) 18 cmManager.deviceMotionUpdateInterval = dt 19 20 // キューで実行するクロージャ 21 let handler:CMDeviceMotionHandler = {(motionData:CMDeviceMotion?, error:Error?) -> Void in 22 self.motionAnimation(motionData, error: error as NSError?) 23 } 24 // 更新で実行するキューを登録してモーションセンサーをスタートする 25 cmManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: handler) 26 27 } 28 29 @IBAction func tapStop(_ sender: Any) { 30 if (cmManager.isDeviceMotionActive) { 31 cmManager.stopDeviceMotionUpdates() 32 } 33 } 34 35 // デバイスモーションセンサーで定期的に実行するメソッド 36 func motionAnimation(_ motionData:CMDeviceMotion?, error:NSError?) { 37 if let motion = motionData { 38 39 // 現在時刻の取得 40 let formatter = DateFormatter() 41 formatter.timeZone = TimeZone.ReferenceType.local 42 formatter.dateFormat = "HH:mm:ss.SSS" // *時*分**.***秒 43 let date1=Date() 44 let dateStr = formatter.string(from: date1) 45 46 // X軸加速度 47 var accX = motion.userAcceleration.x 48 accX = -round(accX*1000)/1000 49 xGyroLabel.text = String(accX) 50 // Y軸加速度 51 var accY = motion.userAcceleration.y 52 accY = -round(accY*1000)/1000 53 yGyroLabel.text = String(accY) 54 // Z軸加速度 55 var accZ = motion.userAcceleration.z 56 accZ = -round(accZ*1000)/1000 57 zGyroLabel.text = String(accZ) 58 59 // 配列に格納 60 csvData.append([String(dateStr),String(accX),String(accY),String(accZ)]) 61 } 62 } 63 64 @IBAction func sendMail(_ sender: Any) { 65 //メールを送信できるかチェック 66 if MFMailComposeViewController.canSendMail()==false { 67 print("Email Send Failed") 68 return 69 } 70 sendMailWithCSV("データ", message: "", csv: csvData) 71 72 } 73 74 func sendMailWithCSV(_ subject: String, message: String, csv: [[String]]) { 75 76 let mailViewController = MFMailComposeViewController() 77 mailViewController.mailComposeDelegate = self 78 let toRecipients = ["*****"] //送信先アドレスの入力 79 80 mailViewController.setSubject(subject) 81 mailViewController.setToRecipients(toRecipients) 82 mailViewController.setMessageBody(message, isHTML: false) 83 mailViewController.addAttachmentData(toCSV(input: csv).data(using: String.Encoding.shiftJIS, allowLossyConversion: false)!,mimeType: "csv", fileName: "data.csv") //csvを添付、ファイル名の指定 84 self.present(mailViewController, animated: true) {} 85 } 86 87 //csv形式への変換 88 func toCSV(input: [[String]]) -> String { 89 return input.map { 90 $0.map { 91 $0.contains(",") || $0.contains("\"") 92 ? "\"" + $0.replacingOccurrences(of: "\"", with: "\"\"") + "\"" 93 : $0 94 }.joined(separator: ",") 95 }.joined(separator: "\r\n") 96 } 97 98 func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 99 switch result { 100 case .cancelled: 101 print("キャンセル") 102 case .saved: 103 print("下書き保存") 104 case .sent: 105 print("送信成功") 106 default: 107 print("送信失敗") 108 } 109 dismiss(animated: true, completion: nil) 110 } 111 112 override func viewDidLoad() { 113 super.viewDidLoad() 114 // Do any additional setup after loading the view, typically from a nib. 115 } 116 117 override func didReceiveMemoryWarning() { 118 super.didReceiveMemoryWarning() 119 // Dispose of any resources that can be recreated. 120 } 121 122}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/25 01:46