iOSアプリ内の各種フォルダをアクセス
基本
NSSearchPathForDirectoriesInDomains()というCのfunctionがありますので、アプリ内の各種標準フォルダへのアクセスは簡単になります。
よくDocumentsとCachesを使えば十分という話もありますが、どんなフォルダが提示してくれるのかを知っておくべきではないかと考えています。
コード
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
NSString *docPathURL = paths[0];
NOはなに?
NOの位置にあるパラメーターの名前はexpandTildeだ。YESにすると下記のようなフルパスが返してくる。
/Users/tonnyxu/Library/Developer/CoreSimulator/Devices/D868C373-789D-40FE-BCE0-3B547974E67C/data/Containers/Data/Application/1AE1D84C-54DC-4615-BE1E-B59DD55A53A4/Documents。NOの場合は~/Documentsというように返してくるexpandTildeはYESにすべきでしょうか?
はい、ファイルを生成、削除、移動するなどの操作はフルパスが必要、~/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 Key | Enum Integer Value | Result |
|---|---|---|
| NSApplicationDirectory | 1 | ~/Applications |
| NSDemoApplicationDirectory | 2 | ~/Applications/Demos |
| NSDeveloperApplicationDirectory | 3 | ~/Developer/Applications |
| NSAdminApplicationDirectory | 4 | ~/Applications/Utilities |
| NSLibraryDirectory | 5 | ~/Library |
| NSDeveloperDirectory | 6 | ~/Developer |
| NSUserDirectory | 7 | |
| NSDocumentationDirectory | 8 | ~/Library/Documentation |
| NSDocumentDirectory | 9 | ~/Documents |
| NSCoreServiceDirectory | 10 | |
| NSAutosavedInformationDirectory | 11 | ~/Library/Autosave Information |
| NSDesktopDirectory | 12 | ~/Desktop |
| NSCachesDirectory | 13 | ~/Library/Caches |
| NSApplicationSupportDirectory | 14 | ~/Library/Application Support |
| NSDownloadsDirectory | 15 | ~/Downloads |
| NSInputMethodsDirectory | 16 | ~/Library/Input Methods |
| NSMoviesDirectory | 17 | ~/Movies |
| NSMusicDirectory | 18 | ~/Music |
| NSPicturesDirectory | 19 | ~/Pictures |
| NSPrinterDescriptionDirectory | 20 | |
| NSSharedPublicDirectory | 21 | ~/Public |
| NSPreferencePanesDirectory | 22 | ~/Library/PreferencePanes |
| NSItemReplacementDirectory | 99 | |
| NSAllApplicationsDirectory | 100 | ~/Applications, ~/Applications/Utilities, ~/Developer/Applications, ~/Applications/Demos |
| NSAllLibrariesDirectory | 101 | ~/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フォルダを使えば確かに十分です。~/の配下にある他のフォルダはあまり使わないほうがいいです。