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
フォルダを使えば確かに十分です。~/
の配下にある他のフォルダはあまり使わないほうがいいです。