Cocoaメモ

Appleプラットフォームでの開発メモ

iOS 5から、ディスクが一杯になると/Library/Cachesがクリアされるようになった

iOS 5.0.1 で、"do not back up" というファイル属性が追加されました。
この属性はどういう時に使うのでしょうか。

Technical Q&A QA1719
How do I prevent files from being backed up to iCloud and iTunes?

http://developer.apple.com/library/ios/#qa/qa1719/_index.html

再生成や再ダウンロードが可能なデータは、バックアップ対象にならないCachesディレクトリに入れておけという指針、これはiOS 5より前からずっと言われている事で特に代わりありません。

iOS 5で新しくなったのは、ディスク不足の時にCachesディレクトリが消されるようになったという点。iOS 4以前では、CachesディレクトリはOSリストアの時にしか消えませんでした。

ディスクをわざと一杯にしてみると、

  • バックグラウンドのアプリを全部殺す
  • 殺したアプリのCachesディレクトリをクリアする

という処理が走りました。他にも何らかのタイミングで消される可能性があります。

元々Cachesはバックアップ対象では無いのでいつデータが無くなっても大丈夫なように対処しておく必要がありますが、iOS 5ではそれが発生する可能性が高くなったという事です。

電子書籍ダウンロードのような物を考えてみましょう。ガイドラインに従うと、サーバにあって再ダウンロード出来るという事で、データはCachesに入れておく事になるでしょう。しかし、ディスクの空きが少ない場合Cachesに保存したデータは読もうと思った時には消えている可能性があります。

QA1719 に記載されている、Offline Data は、このような状況を避けるための方法。

  • "Caches"以外の場所にディレクトリを作成し、ディスク不足時に削除されないようにする
  • "do not backup"属性を付けてバックアップ対象から外す

の合わせ技で、iOS 4以前のCachesディレクトリと同じ挙動をするオフラインデータ用ディレクトリを作成する事が出来ます。

注意点。"do not backup"属性はバックアップするな、というフラグであり、ディスク不足の時に消さないで下さい、というフラグではありません。Cachesは常にディスク不足時の削除対象になります。

iOS 5.0には"do not backup"属性が無いので、iOS 4以前のCachesディレクトリと同じ挙動をさせる事は不可能です。