質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • Swift

    7691questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4352questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4190questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

測定したデータをCSVファイルとしてOneDriveに送信したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 297

yuki84

score 9

開発環境 Xcode9.4 / Swift4.1

以下のような、加速度センサで測定した値を配列に格納し、CSVファイルに変換し、メールに添付して送信するプログラムを作成しました。しかし、便宜上、CSVファイルを直接OneDriveに保存するように改善できないかと考えています。
調べたところ、こちらや、こちらのようにUIDocumentInteractionControllerやUIActivityViewControllerを使ってできそうだとは思ったのですが、CSVファイルの場合は具体的にどのようにコードを書いていけばいいのかわからない状態です。ご教示頂けますでしょうか。参考になるサイトやコードの一部だけでも教えていただければ幸いです。

import UIKit
import MessageUI
import CoreMotion

class ViewController: UIViewController, MFMailComposeViewControllerDelegate  {

    @IBOutlet weak var xGyroLabel: UILabel!
    @IBOutlet weak var yGyroLabel: UILabel!
    @IBOutlet weak var zGyroLabel: UILabel!

    let cmManager = CMMotionManager()
    var csvData=[[String]]() //空の配列の定義
    var dt=0.1 //ジャイロ取得時間間隔[s]

    @IBAction func tapStart(_ sender: Any) {

        // キューを実行する間隔(秒数)
        cmManager.deviceMotionUpdateInterval = dt

        // キューで実行するクロージャ
        let handler:CMDeviceMotionHandler = {(motionData:CMDeviceMotion?, error:Error?) -> Void in
            self.motionAnimation(motionData, error: error as NSError?)
        }
        // 更新で実行するキューを登録してモーションセンサーをスタートする
        cmManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: handler)

    }

    @IBAction func tapStop(_ sender: Any) {
        if (cmManager.isDeviceMotionActive) {
            cmManager.stopDeviceMotionUpdates()
        }
    }

    // デバイスモーションセンサーで定期的に実行するメソッド
    func motionAnimation(_ motionData:CMDeviceMotion?, error:NSError?) {
        if let motion = motionData {

            // 現在時刻の取得
            let formatter = DateFormatter()
            formatter.timeZone = TimeZone.ReferenceType.local
            formatter.dateFormat = "HH:mm:ss.SSS" // *時*分**.***秒
            let date1=Date()
            let dateStr = formatter.string(from: date1)

            // X軸加速度
            var accX = motion.userAcceleration.x
            accX = -round(accX*1000)/1000
            xGyroLabel.text = String(accX)
            // Y軸加速度
            var accY = motion.userAcceleration.y
            accY = -round(accY*1000)/1000
            yGyroLabel.text = String(accY)
            // Z軸加速度
            var accZ = motion.userAcceleration.z
            accZ = -round(accZ*1000)/1000
            zGyroLabel.text = String(accZ)

            // 配列に格納
            csvData.append([String(dateStr),String(accX),String(accY),String(accZ)])            
        }
    } 

    @IBAction func sendMail(_ sender: Any) {
        //メールを送信できるかチェック
        if MFMailComposeViewController.canSendMail()==false {
            print("Email Send Failed")
            return
    }
        sendMailWithCSV("データ", message: "", csv: csvData)

    }

    func sendMailWithCSV(_ subject: String, message: String, csv: [[String]]) {

        let mailViewController = MFMailComposeViewController()
        mailViewController.mailComposeDelegate = self
        let toRecipients = ["*****"] //送信先アドレスの入力

        mailViewController.setSubject(subject)
        mailViewController.setToRecipients(toRecipients)
        mailViewController.setMessageBody(message, isHTML: false)
        mailViewController.addAttachmentData(toCSV(input: csv).data(using: String.Encoding.shiftJIS, allowLossyConversion: false)!,mimeType: "csv", fileName: "data.csv") //csvを添付、ファイル名の指定
        self.present(mailViewController, animated: true) {}
    }

    //csv形式への変換
    func toCSV(input: [[String]]) -> String {
        return input.map {
            $0.map {
                $0.contains(",") || $0.contains("\"")
                    ? "\"" + $0.replacingOccurrences(of: "\"", with: "\"\"") + "\""
                    : $0
                }.joined(separator: ",")
            }.joined(separator: "\r\n")
    }

    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        switch result {
        case .cancelled:
            print("キャンセル")
        case .saved:
            print("下書き保存")
        case .sent:
            print("送信成功")
        default:
            print("送信失敗")
        }
        dismiss(animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

参考URLを確認したところUIDocumentInteractionControllerはurlで送るファイルを取得するようなので
一度ファイルとして保存してからそのパスを指定するような方法ではどうでしょうか。

ファイルの保存については色々と情報があると思います。以下、ご参考までに。
Swiftでファイルの読み込みと保存

また、配列をcsvとして保存する方法は以前の質問にありましたのでそちらを参照すればできるかなと思います。
[swift4]配列をcsvファイルに格納する

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/25 10:46

    回答ありがとうございます。参考リンクを見ながらとりあえずコードを書いて見たいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    7691questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4352questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4190questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。