RでiPhoneアプリのデータを抽出する

俺の睡眠を可視化したい。
で、Sleep CycleというiPhoneアプリを使った。
これは睡眠時の体動をiPhoneの加速度センサで測定するというもの。


ただ残念な事にこれはあくまでアプリ内でしか可視化できない。
runkeeperとも連携しているのでそこからデータを抽出できるかと思ったが何時間寝たとか要約データのみが渡されており俺が欲しいのはそんなんじゃない。
ということでiTunes接続時のバックアップデータを利用してデータを抽出することにした。

バックアップデータから欲しいデータを抽出する

一回抽出するだけだったら以下のアプリ(iPhone Backup Extracter)を動かしてファイル抽出しておしまいで良い。
http://supercrazyawesome.com/
が、毎日データ抽出するとなると面倒だしそんなのは21世紀の人間のやる仕事じゃない。
ということでRから抽出できるようにする。

ファイル名は暗号化されている

さて、バックアップデータは~/Library/Application\ Support/MobileSync/Backup/にあるのだが、ファイル名はSHA-1で暗号化されている。

したがって、こちらも欲しいファイルのパスを暗号化した上で指定する必要がある。
欲しいファイルのパスについては先のアプリを使う等して推測する。
このあたりの情報は以下の資料を参考にした。
http://www.exploit-db.com/docs/19767.pdf
なお、今回欲しいSleep Cycleのデータはsqliteで格納されている。

コード

というわけで以下にコードを掲載した。
可視化した結果はアプリ内で表示されているグラフとは若干異なるのでおそらくなんらかの処理を加えているのだと推測される。
とりあえず、これでSleep Cycleに限らず任意のアプリデータにアクセスできるようになったので今後色々と捗る。

path_root <- "~/Library/Application\ Support/MobileSync/Backup/"
paths <- list.files(path_root)
path <- paths[which.max(file.info(paths)$mtime)]
library("digest")
path_sleepcycle <- "AppDomain-com.lexwarelabs.goodmorning-Documents/eventlog.sqlite"
path_sleepcycle_converted <- digest(path_sleepcycle, "sha1", serialize=FALSE)

library("dplyr")
db <- src_sqlite(paste(sep="/", path, path_sleepcycle_converted))
# 睡眠時の体動データはZSLEEPEVENTに格納されている
data_sleep <- db %>% tbl("ZSLEEPEVENT") %>% as.data.frame 
data_sleep$ZTIME <- as.POSIXct(data_sleep$ZTIME, origin="2001-01-01")

# 可視化する
library("ggplot2")
ggplot(data_sleep %>% filter(ZTIME>='2015-03-31' & ZTIME<='2015-04-02'), aes(ZTIME, ZINTENSITY,group=1)) + geom_line()


enjoy!!!