2016年8月4日木曜日

保存先のpathが毎回変わる?

iOSのファイル構造

アプリ内にはデベロッパーやiOSがデータを読み書きできるディレクトリがある。
例えば以下のようなもの。

  • /Documents
    • アプリ固有のファイルを保存
    • アプリを消すまでiTunesでバックアップされる
  • /Library/Preferences
    • アプリ固有の環境設定ファイルを保存
    • バックアップされるが、デベロッパーは直接いじっちゃダメらしい
  • /Library/Caches
    • アプリ固有のサポートファイルを保存
    • バックアップされないし、アプリがアクティブ時でも削除される可能性がある
  • /tmp
    • 一時ファイルを保存
    • バックアップされないが、アプリがアクティブ時は保持される
一番使うのはDocumentsディレクトリで、アクセスにはpathを作って読み書きする。

pathが毎回変わる!?

そのpathなのだが、実機で確認したところ、Xcodeから起動するごとに絶対pathの途中のディレクトリ名が変更されていることがわかった。
具体的には、以下の赤の部分が大きく変わっている。

/var/mobile/Containers/Data/Application/42F81D0D-EDC1-4BB3-AC03-BBE7D6DC8C79/Documents/ファイル名
/var/mobile/Containers/Data/Application/2E9C5905-1A89-40BA-B727-3DDD8AE13BC5/Documents/ファイル名

そのため、絶対pathでファイルを書き込み、次の起動時に読もうとすると、ファイルが存在せずに読めなくなるのだ。
なぜこうなってるのかわからないが、iOS8からの仕様らしい。

対処法

対処法だが、NSSearchPathForDirectoriesInDomains という関数があるので、それを使ってやれば起動ごとに変化するpathを得ることができる。(返り値は配列なので、index 0を参照すること)
もちろんディレクトリ内のファイルにもアクセスできる。

Swift
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first ?? ""

Objective-C
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

このpathの後に「/ファイル名 」を加えてやれば読み書きできるのだ。

0 件のコメント:

コメントを投稿