iOSアプリ内の各種フォルダをアクセス

基本

NSSearchPathForDirectoriesInDomains()というCのfunctionがありますので、アプリ内の各種標準フォルダへのアクセスは簡単になります。

よくDocumentsCachesを使えば十分という話もありますが、どんなフォルダが提示してくれるのかを知っておくべきではないかと考えています。

コード

NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
NSString *docPathURL = paths[0];
  1. NOはなに
    NOの位置にあるパラメーターの名前はexpandTildeだ。YESにすると下記のようなフルパスが返してくる。
    /Users/tonnyxu/Library/Developer/CoreSimulator/Devices/D868C373-789D-40FE-BCE0-3B547974E67C/data/Containers/Data/Application/1AE1D84C-54DC-4615-BE1E-B59DD55A53A4/DocumentsNOの場合は~/Documentsというように返してくる
  2. expandTildeYESにすべきでしょうか
    はい、ファイルを生成、削除、移動するなどの操作はフルパスが必要、~/Documentsのままだと、下記のエラーが発生する。Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x7f912ad2e030 {NSFilePath=~/Documents/aaa/bbbb/ccc, NSUnderlyingError=0x7f912ad35700 "The operation couldn’t be completed. Permission denied"}

アクセス可能な各種フォルダ

Enum KeyEnum Integer ValueResult
NSApplicationDirectory1~/Applications
NSDemoApplicationDirectory2~/Applications/Demos
NSDeveloperApplicationDirectory3~/Developer/Applications
NSAdminApplicationDirectory4~/Applications/Utilities
NSLibraryDirectory5~/Library
NSDeveloperDirectory6~/Developer
NSUserDirectory7
NSDocumentationDirectory8~/Library/Documentation
NSDocumentDirectory9~/Documents
NSCoreServiceDirectory10
NSAutosavedInformationDirectory11~/Library/Autosave Information
NSDesktopDirectory12~/Desktop
NSCachesDirectory13~/Library/Caches
NSApplicationSupportDirectory14~/Library/Application Support
NSDownloadsDirectory15~/Downloads
NSInputMethodsDirectory16~/Library/Input Methods
NSMoviesDirectory17~/Movies
NSMusicDirectory18~/Music
NSPicturesDirectory19~/Pictures
NSPrinterDescriptionDirectory20
NSSharedPublicDirectory21~/Public
NSPreferencePanesDirectory22~/Library/PreferencePanes
NSItemReplacementDirectory99
NSAllApplicationsDirectory100~/Applications,
~/Applications/Utilities,
~/Developer/Applications,
~/Applications/Demos
NSAllLibrariesDirectory101~/Library,
~/Developer
  • 基本的にOSXのfunctionをそのままiOSに移してきたので、documentsとcachesぐらいは日常の利用に支障はないでしょう。
  • ~/tmpフォアルだのアクセスはNSTemporaryDirectory()を使えば。

~/Library/Preferences

  • ~/Library/PreferencesフォルダはNSUserDefaults専用で、アプリだけではなくて、OSからの書き込み・読み取りもあるので、触らないほうが安全。

Backup関連

Appleの公式Docをいつも参照してね。ここは簡単のリストだけ

Backupの対象外

  • {Application_Home}/AppName.app
  • {Application_Data}/Library/Caches
  • {Application_Data}/tmp

あとは、任意のファイルを作る際にURLにNSURLIsExcludedFromBackupKeyを入れれば、バックアップの対象外になる。

NSURL* URL= [NSURL fileURLWithPath: filePathString];
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
 
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                              forKey: NSURLIsExcludedFromBackupKey error: &error];

アプリのUpdate関連

アプリをアップデートする際に、下記の二つのフォルダの内容は丸ごと新しいバージョンのアプリにコピーする。

  • {Application_Data}/Documents
  • {Application_Data}/Library

他のフォルダもコピーされるかもしれないのが、保証はない


ゆえに、通常の業務について、~/Documents~/Library/Caches~/tmpフォルダを使えば確かに十分です。~/の配下にある他のフォルダはあまり使わないほうがいいです。