人気記事

iPhone Swift

CMMotionActivityManagerを使ってiPhoneの行動ログをCSVファイルで取得する

更新日:

iPhoneには加速度センサーやGPSといった様々なセンサーが搭載されており、アプリでそれらのデータを取り出すことも可能です。

ググると行動履歴というのがよく出てきますが、これはGPSの記録をトレースしたもののようです。

今回は上記とは異なり自分が何時にどういった行動をしていたのかを振り返るためにCMMotionActivityManagerという機能を使って、1週間分の行動ログを取り出してみたいと思います。

 

得られる行動ログの種類としてstationary,walking,running,cycling,automotive,unknownがあります。

startDateで取得時間を把握できます。

またconfidenceという測定の自信度も取得できます。

startDate stationary walking running cycling

atuto

motive

unknown confidence
2020-05-03 09:35:07 +0000 1 0 0 0 0 0 Excellent
2020-05-03 09:37:25 +0000 0 0 0 0 0 0 Excellent
2020-05-03 09:38:53 +0000 0 1 0 0 0 0 Good
2020-05-03 09:38:55 +0000 0 1 0 0 0 0 Excellent
2020-05-03 09:39:26 +0000 0 0 1 0 0 0 Excellent
2020-05-03 09:39:29 +0000 0 0 0 0 0 0 Excellent
2020-05-03 09:40:04 +0000 1 0 0 0 0 0 Excellent
2020-05-03 09:41:57 +0000 0 0 0 0 0 0 Excellent

 

やり方


(1) CMMotionActivityManagerをインスタンス化します。

queryActivityStartingの引数に開始時刻と終了時刻を指定して、キューに取得データを取り込みます。

最大7日間取れるようなので今回はd2を現在、d1を7日前としました。

コメントアウトしていますがmotionActivityをprintすれば上の表のような出力が得られることが確認できます。

       let motionActivityManager = CMMotionActivityManager()
        var motionDataList = [motionData]()
        var motionConfidence : String = ""
    
        let d1 = Date() - (60*60*24*7) //7日間
        let d2 = Date()
        
        motionActivityManager.queryActivityStarting(from: d1, to: d2, to: OperationQueue.main){ (motionActivities, error) in
            for motionActivity in motionActivities! {
                //print("-----motionActivity:\(motionActivity)")
                

(2)次にログを出力するための準備です。

 motionDataという独自クラスにmotionActivityデータを格納することにします。

motionActivityを配列にしたものがmotionDataListです。

//motionDataList
                let motion = motionData()
                motion.startDate = motionActivity.startDate
                motion.confidence = motionConfidence
                motion.unknown = (motionActivity.unknown) ? 1 : 0
                motion.stationary = (motionActivity.stationary) ? 1 : 0
                motion.walking = (motionActivity.walking) ? 1 : 0
                motion.running = (motionActivity.running) ? 1 : 0
                motion.automotive = (motionActivity.automotive) ? 1 : 0
                motion.cycling = (motionActivity.cycling) ? 1 : 0
                
                motionDataList.append(motion)

(3)ログ出力

あとはCSVファイルとしてログ出しします。

  //csv output
            let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale(identifier: "ja_JP")
            dateFormatter.dateFormat = "MM-dd HH:mm:ss"
            
            let fileName = dateFormatter.string(from: motionDataList.last!.startDate)
            let filepath =  NSHomeDirectory() + "/Documents/" + fileName + ".csv"
            self.createFile(filePath: filepath)
            self.CSVoutput(filePath: filepath, motionDataList: motionDataList)

 

ソースコード全体

import UIKit
import CoreMotion

class motionData {
    var startDate = Date()
    var confidence: String = ""
    var unknown: Int = 0
    var stationary: Int = 0
    var walking : Int = 0
    var running: Int = 0
    var automotive: Int = 0
    var cycling: Int = 0
}

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        SensorUpdate()

    }
    
    func SensorUpdate(){
        
        let motionActivityManager = CMMotionActivityManager()
        var motionDataList = [motionData]()
        var motionConfidence : String = ""
    
        let d1 = Date() - (60*60*24*7) //7日間
        let d2 = Date()
        
        motionActivityManager.queryActivityStarting(from: d1, to: d2, to: OperationQueue.main){ (motionActivities, error) in
            for motionActivity in motionActivities! {
                //print("-----motionActivity:\(motionActivity)")
                
                if motionActivity.confidence == CMMotionActivityConfidence.low{
                    motionConfidence = "Low"
                }else if motionActivity.confidence == CMMotionActivityConfidence.medium{
                    motionConfidence = "Good"
                }
                else if motionActivity.confidence == CMMotionActivityConfidence.high{
                    motionConfidence = "Excellent"
                }
                
                //motionDataList
                let motion = motionData()
                motion.startDate = motionActivity.startDate
                motion.confidence = motionConfidence
                motion.unknown = (motionActivity.unknown) ? 1 : 0
                motion.stationary = (motionActivity.stationary) ? 1 : 0
                motion.walking = (motionActivity.walking) ? 1 : 0
                motion.running = (motionActivity.running) ? 1 : 0
                motion.automotive = (motionActivity.automotive) ? 1 : 0
                motion.cycling = (motionActivity.cycling) ? 1 : 0
                
                motionDataList.append(motion)
            }
            
            //csv output
            let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale(identifier: "ja_JP")
            dateFormatter.dateFormat = "MM-dd HH:mm:ss"
            
            let fileName = dateFormatter.string(from: motionDataList.last!.startDate)
            let filepath =  NSHomeDirectory() + "/Documents/" + fileName + ".csv"
            self.createFile(filePath: filepath)
            self.CSVoutput(filePath: filepath, motionDataList: motionDataList)
        }
    }
    

    
    func createFile(filePath: String ){
        
        FileManager.default.createFile(atPath: filePath, contents: nil, attributes: nil)

    }
    
    
    func CSVoutput(filePath: String ,motionDataList : [motionData]){
        
        let fileURL = URL(fileURLWithPath: filePath)
        
        for index in 0..<motionDataList.count {
        
            var fileStrData = "\(motionDataList[index].startDate),\(motionDataList[index].stationary),\(motionDataList[index].walking),\(motionDataList[index].running),\(motionDataList[index].cycling),\(motionDataList[index].automotive),\(motionDataList[index].unknown),\(motionDataList[index].confidence)"
    
            fileStrData += "\n"
        
        do {
            let fileHandle = try FileHandle(forWritingTo: fileURL)
            
            if index==0{
                
                let initStrData = "startDate,stationary,walking,running,cycling,atutomotive,unknown,confidence\n"
                fileHandle.write(initStrData.data(using: String.Encoding.utf8)!)
            
            }
            
            // add on end of file
            fileHandle.seekToEndOfFile()
            fileHandle.write(fileStrData.data(using: String.Encoding.utf8)!)
            print("logger success")
            
        } catch let error as NSError {
            print("failed to append: \(error)")
        }
        }
    }
    
    
}

ログがファイルとして取得できるので、あとは色々なツールから可視化することもできます。

 

以上。

 

 

 

-iPhone, Swift

Copyright© ITエンジニアへの転身 , 2024 All Rights Reserved Powered by STINGER.