iOS8へのアップデートでアプリのドキュメントディレクトリのパスが変わってしまいます。
正確にはドキュメントディレクトリのパスにはアプリ固有のIDが含まれているが、
そのIDが変わってしまうようだ。
自分が昔作成したアプリで問題が発生したため、原因に気づくことができた。
どんなときに問題か?
ドキュメントディレクトリの絶対パスをユーザーデフォルトなどに格納していて、
アプリ内でのファイル保存時などにその格納した値を使用しているケースが考えられる。
この場合、OSアップデート後にそのファイルにアクセスしようとした際、
ファイルが見つけられずにエラーとなる。
例えば、私は動画を端末内に保存し、オフラインで視聴できるアプリを使用していた。
iOS8へのアップデート前は問題なく、オフラインで視聴できていた。
しかし、iOS8へのアップデート後、オフライン動画の一覧を開こうとすると、アプリが強制終了してしまっていた。
そのときは原因が分からなかったが、アプリを削除したところ、アプリを使用できるようになった。
当然、OSアップデート前に保存していたオフライン動画は削除されている。
推測だが、ドキュメントディレクトリの絶対パスが変わってしまったためではないだろうか。
ちなみに私はUtilityという共通で使用できるクラスメソッドを集めたファイルを用意し、
ドキュメントディレクトリに保存しているファイルにアクセスする場合は
このメソッドを使用することで解決した。
ドキュメントディレクトリにあるファイルにアクセスする際、
都度、ドキュメントディレクトリのパスをOSから取得しアクセスしている。
これによって、OSアップデートでドキュメントディレクトリのパスが変わっても対応可能である。
// Publicメソッド。ファイルにアクセスするときはこのメソッドを使用
+ (NSString *)settinfFilePath{
return [[self documentDirectory] stringByAppendingPathComponent:@"setting.json"];
}
// プライベートメソッド
+ (NSString *)documentDirectory{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = paths.firstObject;
return dir;
}
※なお、アプリアップデート時もドキュメントディレクトリのパスは変わるらしいが、今まで気付かなかった。
http://www.zero4racer.com/blog/453
また、関連した話として、iOS8にすると、Xcodeでデバッグする度に、
ドキュメントディレクトリ(パス内のアプリID)が変更されることがわかった。
AppDelegateのdidFinishLaunchingWithOptions内に下記追加し確認した。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dir = paths.firstObject;
NSLog(@"%@", dir);
結果は以下のようになった。
1. iPhone4(iOS7.1.1)
→ デバッグしても、ドキュメントディレクトリ(パス内のアプリID)が変更されない
1回目デバッグ起動時
/var/mobile/Applications/7132DFFE-F99D-4ECA-B07E-C1190C14AAC6/Documents
2.iPhone5(iOS8.0.2)
→ デバッグする都度、ドキュメントディレクトリ(パス内のアプリID)が変更される
1回目デバッグ起動時
/var/mobile/Containers/Data/Application/5C6DE361-35BD-4587-B1AA-98EC280FEF37/Documents
2回目デバッグ起動時
/var/mobile/Containers/Data/Application/30AED3CA-83BB-4D17-A0C1-7DA1EC1830AC/Documents
・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動