iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
Day One Classicという日記アプリを使っていたが、iOSのバージョンが上がって使えなくなったので、このアプリのデータを取り出して、自分の日記アプリの取り込みたいと考え、Day One Classicのデータの書式を調べた。
Journal.dayoneがデータの名前で、これはディレクトリだった。
.
`-- Journal.dayone
|-- entries
| |-- UUID1.doentry
| `-- UUIDn.doentry
`-- photos
|-- UUID1.jpg
`-- UUIDm.jpg
日記の本文はentriesディレクトリ配下に、投稿毎の単位でsuffixが.doentryのファイルに記録されている。日記に写真がある場合はphotosディレクトリ配下に対応する.doentryファイルと同じUUIDでJPEGファイルとして格納されている。
日記の本文はプロパティリストの書式となっていて、NSDictionaryとして読み込むことができる。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Creation Date</key>
<date>2014-01-03T21:40:52Z</date>
<key>Creator</key>
<dict>
<key>Device Agent</key>
<string>iPhone/iPhone5,2</string>
<key>Generation Date</key>
<date>2014-01-03T21:40:52Z</date>
<key>Host Name</key>
<string>iPhone5Black64GB</string>
<key>OS Agent</key>
<string>iOS/7.0.4</string>
<key>Software Agent</key>
<string>Day One iOS/1.12</string>
</dict>
<key>Entry Text</key>
<string>娘と
俺の藤井2014</string>
<key>Location</key>
<dict>
<key>Administrative Area</key>
<string>埼玉県</string>
<key>Country</key>
<string>日本</string>
<key>Latitude</key>
<real>35.904324925538063</real>
<key>Locality</key>
<string>さいたま市 大宮区</string>
<key>Longitude</key>
<real>139.62506669586489</real>
<key>Place Name</key>
<string>下町 1丁目2番</string>
</dict>
<key>Music</key>
<dict>
<key>Track</key>
<string>Weekend Sunshine - Dec 7, 2013</string>
</dict>
<key>Starred</key>
<false/>
<key>Time Zone</key>
<string>Asia/Tokyo</string>
<key>UUID</key>
<string>B2713EC2EAF54B64884E8FF85D20DE5F</string>
</dict>
</plist>
Swiftで読み込むコードを書いてみた。
import Foundation
func dump(url aUrl: URL) {
print("dump(\(aUrl))")
do {
let urls = try FileManager.default.contentsOfDirectory(
at: aUrl,
includingPropertiesForKeys: nil,
options: [.skipsHiddenFiles, .skipsSubdirectoryDescendants])
urls.forEach { url in
print(url)
if url.hasDirectoryPath {
dump(url: url)
} else {
if url.pathExtension == "doentry" {
let entry = NSDictionary(contentsOfFile: url.path)
print("\(String(describing: entry))")
}
}
}
} catch {
print(error.localizedDescription)
}
}
let journalDayonePath: String = "/Users/yukio/Documents/Development/Projects/KeepADiary/temp/Day One/Journal.dayone"
let journalDayoneURL = URL(fileURLWithPath: journalDayonePath)
dump(url: journalDayoneURL)
Xcodeのデバッガで値をダンプして、例えば、日付はNSDateのオブジェクトになっていることが確認できた。