CloudKitは日記アプリのモデルを格納する場所には向いていないということで、iCloudドキュメントを試してみた。
iCloudコンテナ・ディレクトリにファイルを格納するのだが、このコンテナ、CloudKitで出てきたコンテナと同じ識別子で指す物のようだ。ただ、識別子は同じでも、領域は異なるのだと思う。
以下がファイルに書き込むコードだ。
let containerURL = FileManager.default.url(forUbiquityContainerIdentifier: "iCloud.com.example.KeepADiary")
let documentsURL = containerURL?.appendingPathComponent("Documents")
let fileURL = documentsURL?.appendingPathComponent("my.diary")
/* write */
let todayText = Date().description
do {
try todayText.write(to: fileURL!, atomically: true, encoding: .utf8)
}
catch {
print("write error")
}
このコードは、macOSとiOSで動作するが、macOSで実行した際のfileURLの内容は以下のとおり。
file:///Users/yukio/Library/Mobile%20Documents/iCloud~com~example~KeepADiary/Documents/my.diary
このディレクトリでファイルを確認すると以下のとおり。
$ pwd
/Users/yukio/Library/Mobile Documents/iCloud~com~example~KeepADiary/Documents
$ ls
my 3.diary my 4.diary my 5.diary my 6.diary my 7.diary
ファイル書き込み時に、このディレクトリのファイルを確認したところ、my.diary という名前のファイルが作成されるが、しばらくすると、my 8.diary という風にファイル名が変更される。何故だ!ファイルの上書き防止機能?版管理機能?
ソースコード
GitHubからどうぞ。
https://github.com/murakami/KeepADiary - GitHub
関連情報
日記アプリのデータ管理
Cocoa勉強会 BUKURO.swift (connpass)
Cocoa勉強会 BUKURO.swift (ATND)
Cocoa勉強会 BUKURO.swift (Peatix)
【Cocoa練習帳】
http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)
Qiita