LoginSignup
16
16

More than 5 years have passed since last update.

【Objective-C, Swift】iOS8へのアップデートでアプリのドキュメントディレクトリのパスが変わる

Last updated at Posted at 2014-10-02

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

スクリーンショット 2014-10-02 11.30.05.png

2回目デバッグ起動時
スクリーンショット 2014-10-02 11.31.41.png

2.iPhone5(iOS8.0.2)
→ デバッグする都度、ドキュメントディレクトリ(パス内のアプリID)が変更される

1回目デバッグ起動時
/var/mobile/Containers/Data/Application/5C6DE361-35BD-4587-B1AA-98EC280FEF37/Documents

スクリーンショット 2014-10-02 11.33.49.png

2回目デバッグ起動時
/var/mobile/Containers/Data/Application/30AED3CA-83BB-4D17-A0C1-7DA1EC1830AC/Documents

スクリーンショット 2014-10-02 11.34.33.png

 
・Swiftに関する他の記事はこちら
Swift入門 勉強記録 その1 Swiftとは、Playground起動

Swift入門 勉強記録 その2 変数、定数、文字列

Swift入門 勉強記録 その3 セミコロン

Swift入門 勉強記録 その4 数値、真偽値

Swift入門 勉強記録 その5 Tuple(組)とは

Swift入門 勉強記録 その6 数値を文字列とするには

Swift入門 勉強記録 その7 繰り返し

Swift入門 勉強記録 その8 条件分岐

Swift入門 勉強記録 その9 Optional型

Swift入門 勉強記録 その10 Collection

・その他
【Swift, Objective-C】文字列からURLを検出し、リンク表示するには?
 

16
16
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16