取得した画像をDocumentsディレクトリに適当に格納しといたらappleにrejectされた!
2013年05月28日
どうも、高山です。
またも、iOSアプリの話です。おふざけ無し。
なんだーかんだーと時間がかけて作ったアプリをappleに申請して、まだかまだかと待つこと2週間近く。
どうかな?と思ってiTunesConnectに見に行くと、ある意味予想通りrejectされておりまして、
「Resolution Centerに来い!」というので、行ってみると、何やら英文が。。。
なんだかよく分からないが、
「アプリ内部で保持するデータは、iCloudにバックアップされないようにしなければいけない」
と言っているもよう。
確かに、XML内の画像のURLを元に画像をサーバーから取得し、
Documentsディレクトリに格納していたのだけど、特に何も処置していなかった。
アプリで自由に触ることができるディレクトリは4つで、
iCloudのバックアップ対象で分けると以下のようになります。
【iCloudバックアップ対象】
■Documents:アプリのデータを保存するディレクトリ
■Library/Preferences:アプリの設定ファイルを保存するディレクトリ
【iCloudバックアップ対象外】
■Library/Caches:キャッシュファイルを書き込むディレクトリ
■tmp:一時ファイルを保存するディレクトリ
で、どうするかなーと。
画像の保存先を「Library/Caches」か「tmp」にすれば良いのだけど、ちょっと違う。
やっぱり保存先は「Documents」のままで、「Documents」内に画像格納用のディレクトリを作り、
このディレクトリをiCloudのバックアップ対象外とすることとした。
以下手順。
1.画像格納先ディレクトリの作成
- (BOOL)makeDirForAppContents
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *baseDir = [self myDocumentsPath];
BOOL exists = [fileManager fileExistsAtPath:baseDir];
if (!exists) {
NSError *error;
BOOL created = [fileManager createDirectoryAtPath:baseDir withIntermediateDirectories:YES attributes:nil error:&error];
if (!created) {
NSLog(@"ディレクトリ作成失敗");
return NO;
}
} else {
return NO; // 作成済みの場合はNO
}
return YES;
}
- (NSString *)myDocumentsPath
{
NSString *documentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *path = [documentsPath stringByAppendingPathComponent:@"hoge"]; //追加するディレクトリ名を指定
return path;
}
2.画像格納先ディレクトリをiCloudのバックアップ対象外に変更
下記ソースは、これ(https://developer.apple.com/library/ios/#qa/qa1719/_index.html)を参考に。
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
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);
if (result == 0) {
NSLog(@":%@", [URL path]);
return YES;
} else {
NSLog(@"属性マーク設定失敗");
return NO;
}
}
後は、こんな感じで呼んであげると良いかと。
NSString *filePath = [self myDocumentsPath];
// データ保存用のディレクトリを作成する
if ([self makeDirForAppContents]) {
// ディレクトリに対して「do not backup」属性をセット
NSURL *dirUrl = [NSURL fileURLWithPath:filePath];
[self addSkipBackupAttributeToItemAtURL:dirUrl];
}
これで再申請して、無事通りましたー。
取得したデータの保存先には、皆さん気をつけましょう!
高山でした。
またも、iOSアプリの話です。おふざけ無し。
なんだーかんだーと時間がかけて作ったアプリをappleに申請して、まだかまだかと待つこと2週間近く。
どうかな?と思ってiTunesConnectに見に行くと、ある意味予想通りrejectされておりまして、
「Resolution Centerに来い!」というので、行ってみると、何やら英文が。。。
なんだかよく分からないが、
「アプリ内部で保持するデータは、iCloudにバックアップされないようにしなければいけない」
と言っているもよう。
確かに、XML内の画像のURLを元に画像をサーバーから取得し、
Documentsディレクトリに格納していたのだけど、特に何も処置していなかった。
アプリで自由に触ることができるディレクトリは4つで、
iCloudのバックアップ対象で分けると以下のようになります。
【iCloudバックアップ対象】
■Documents:アプリのデータを保存するディレクトリ
■Library/Preferences:アプリの設定ファイルを保存するディレクトリ
【iCloudバックアップ対象外】
■Library/Caches:キャッシュファイルを書き込むディレクトリ
■tmp:一時ファイルを保存するディレクトリ
で、どうするかなーと。
画像の保存先を「Library/Caches」か「tmp」にすれば良いのだけど、ちょっと違う。
やっぱり保存先は「Documents」のままで、「Documents」内に画像格納用のディレクトリを作り、
このディレクトリをiCloudのバックアップ対象外とすることとした。
以下手順。
1.画像格納先ディレクトリの作成
- (BOOL)makeDirForAppContents
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *baseDir = [self myDocumentsPath];
BOOL exists = [fileManager fileExistsAtPath:baseDir];
if (!exists) {
NSError *error;
BOOL created = [fileManager createDirectoryAtPath:baseDir withIntermediateDirectories:YES attributes:nil error:&error];
if (!created) {
NSLog(@"ディレクトリ作成失敗");
return NO;
}
} else {
return NO; // 作成済みの場合はNO
}
return YES;
}
- (NSString *)myDocumentsPath
{
NSString *documentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *path = [documentsPath stringByAppendingPathComponent:@"hoge"]; //追加するディレクトリ名を指定
return path;
}
2.画像格納先ディレクトリをiCloudのバックアップ対象外に変更
下記ソースは、これ(https://developer.apple.com/library/ios/#qa/qa1719/_index.html)を参考に。
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
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);
if (result == 0) {
NSLog(@":%@", [URL path]);
return YES;
} else {
NSLog(@"属性マーク設定失敗");
return NO;
}
}
後は、こんな感じで呼んであげると良いかと。
NSString *filePath = [self myDocumentsPath];
// データ保存用のディレクトリを作成する
if ([self makeDirForAppContents]) {
// ディレクトリに対して「do not backup」属性をセット
NSURL *dirUrl = [NSURL fileURLWithPath:filePath];
[self addSkipBackupAttributeToItemAtURL:dirUrl];
}
これで再申請して、無事通りましたー。
取得したデータの保存先には、皆さん気をつけましょう!
高山でした。
Posted by iA SEチーム at 23:00│Comments(0)
│iPhoneアプリ