スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
このエントリーをはてなブックマークに追加

[iOS]Application Supportディレクトリの作成とバックアップ対象外の指定

iOS5.0.1から、アプリがメモリ限界に達した時の挙動が変わっていたようなので対応を行った。
iOS 5から、ディスクが一杯になると/Library/Cachesがクリアされるようになった

ファイル保存を行う場合以前までは /Library/Caches ディレクトリを利用していたが、今回のことで変更しました。
今回探したのは、ダウンロードしたムービーコンテンツをおいておける場所だったのですが、/Library/Application Support ディレクトリを置くことにしました。
(判断基準はファイルシステムプログラミングガイド16ページ目:アプリケーションファイルの置き場所を参考にしてください)

以下は、Application Supportフォルダを作成し、com.apple.MobileBackupの属性を付加するコードです。
//import
#import <sys/xattr.h>

//Application Supportディレクトリのパス(NSString)を返す。(無ければ自動で生成する)
//また、生成に失敗すればnilを返す
+ (NSString *)ApplicationSupportDirectory {
NSString *applicationSupportDirectory = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) lastObject];
NSError *error = nil;
if ( ![[NSFileManager defaultManager] fileExistsAtPath:applicationSupportDirectory isDirectory:NULL] ) {
if (![[NSFileManager defaultManager]
createDirectoryAtPath:applicationSupportDirectory
withIntermediateDirectories:NO
attributes:nil
error:&error])
{
NSAssert(NO, ([NSString stringWithFormat:@"Failed to create App Support directory %@ : %@", applicationSupportDirectory,error]));
NSLog(@"Error creating application support directory at %@ : %@",applicationSupportDirectory,error);
return nil;
}
else
{
NSURL *dirPath = [NSURL fileURLWithPath:applicationSupportDirectory isDirectory:YES];
int result = [self addSkipBackupAttributeToItemAtURL:dirPath];
if(!result) {
NSLog(@"Error addSkipBackupAttributeToItemAtURL");
return nil;
}
}
}
return applicationSupportDirectory;
}

//iOS5.0.1に対応の場合のみ利用(iOS5.1以降には使えない)
//+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
//{
// assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
//
// const char* filePath = [[URL path] fileSystemRepresentation];
//
// const char* attrName = "com.apple.MobileBackup";
// u_int8_t attrValue = 1;
//
// int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
// return result == 0;
//}

//iOS5.1以降に対応
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}



参考URL1:[ファイルシステムプログラミングガイド]アプリケーションファイルの置き場所
参考URL2:CoreData: Documentsフォルダ以外にsqliteファイルを置く
参考URL3:[iOS][Objective-C] iOS5で特定のディレクトリをバックアップ対象外とする方法
参考URL4:[Technical Q&A QA1719]How do I prevent files from being backed up to iCloud and iTunes?
このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

あまりシステムディレクトリをNSFileManagerのcreateDirectoryAtPathで作成するのはどうかなと最近思います。
(オーナーやアクセス権限の付与が不明なため。多分問題は起きないと思います)

個人的にはNSFileManagerのURLForDirectoryを使用し、ファイルパス管理はNSURLの使用をお勧めします。
以下、サンプル

/// Application SupportのURL取得
+ (NSURL *)applicationSupportDirectory {
NSError *error;
NSURL *url;

url = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error];
if (error) {
NSLog(@"Error:%d %@", (int)error.code, error.localizedDescription);
} else {
[self addSkipBuckupAttributeToURL:&url];
}
return url;
}

#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_1
#define USE_UNDER_IPHONE_5_1
#import <sys/xattr.h>
#endif
/// バックアップから除外する属性の追加
+ (BOOL)addSkipBuckupAttributeToURL:(inout NSURL **)url {
BOOL result;
NSError *error;

#ifdef USE_UNDER_IPHONE_5_1
if ([[[UIDevice currentDevice] systemVersion] compare:@"5.1" options:NSNumericSearch] != NSOrderedDescending) {
#endif
result = [*url setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:&error];
if (error)
NSLog(@"Error:%d %@", (int)error.code, error.localizedDescription);
#ifdef USE_UNDER_IPHONE_5_1
} else {
Byte attrValue = 1;
result = setxattr(url.path.UTF8String, "com.apple.MobileBackup", &attrValue, sizeof(attrValue), 0, 0);
}
#endif
if (!result)
NSLog(@"Error: Can't set 'NSURLIsExcludedFromBackupKey' on URL(%@).", [*url path]);

return result;
}
Translation


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
プロフィール

チーズくん

Author:チーズくん
個人的メモをただ羅列しています。
twitter:@cheese1038

バロメーター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。