5

私のアプリは、iOS データ ストレージ ガイドラインに従う必要があるという理由で拒否されました。私はすでにスタックオーバーフローでいくつかの回答を読んでおり、すでにいくつかのブログを読んでいます...私は自分の問題を知っています。最初のアプリケーションの起動時に、1つのsqlite dbをコピーし、ドキュメントフォルダーにいくつかの画像を解凍します。ドキュメントディレクトリ内のファイルを自動的にバックアップするのはicloudの問題です。アプリで icloud を使用する必要はありませんが、ファイルはアプリケーションのベース データであり、保存する必要があるため、ドキュメント フォルダーに残す必要があります (キャッシュ フォルダーまたは一時フォルダーは正しいソリューションではありません)。だから私はバックアップを禁止するためにファイルごとに設定できるフラグについて読んだ:

[URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey エラー:nil];

また、この方法は 5.0.1 以上の iOS でのみ機能することも読みましたが、それ以外の場合は単純に無視されます (iOS の展開ターゲットを 4.3 に設定しました)... この方法を使用すると、アプリは再び拒否されます古い iOS デバイスのバックアップが管理されていないためですか? はいの場合、NSURLIsExcludedFromBackupKey を設定するクロス iosversion メソッドがありますか?

編集申し訳ありませんが、icloud は iOS 5.0 より前のバージョンには存在しないため、問題はバージョン 5.0 と 5.0.1 の間の違いのみに関係していると思いますが、間違っていますか?

4

4 に答える 4

3

注: 使用しないでください

NSString *mediaDir = [NSString stringWithFormat:@"%@/Library/Caches/%@", NSHomeDirectory(), MEDIA_DIRECTORY];

あなたは名前について仮定をしているからです。むしろ、次を使用します。

NSArray* lCachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* lCacheDirectory = [lCachePaths objectAtIndex:0];
于 2012-05-28T06:29:29.413 に答える
3

このメソッドを使用して、ドキュメント フォルダーに保存されるすべてのファイルを渡しました。

これを試して

-(BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{

const char* filePath = [[URL path] fileSystemRepresentation];
const char* attrName = "com.apple.MobileBackup";
if (&NSURLIsExcludedFromBackupKey == nil) {
    // iOS 5.0.1 and lower
    u_int8_t attrValue = 1;
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;

}
else {
    // First try and remove the extended attribute if it is present
    int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0);
    if (result != -1) {
        // The attribute exists, we need to remove it
        int removeResult = removexattr(filePath, attrName, 0);
        if (removeResult == 0) {
            NSLog(@"Removed extended attribute on file %@", URL);
        }
    }

    // Set the new key
    NSError *error = nil;
    [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    return error == nil;
}
}

このメソッドは、Stack Overflow で見つけました。

于 2012-04-26T16:01:29.463 に答える
1

私のアプリでは、ファイル(私の場合は画像)をバンドルに追加して解決し、ユーザーが生成したデータ/画像が配置されるドキュメントフォルダーに画像が存在する場合は、画像をロードする方法をチェックインしました。

そこにない場合は、事前に入力されたイメージの 1 つであることがわかり、バンドルからロードします。

sqlite ファイルの場合: 満足のいく解決策ではありませんが、事前に入力された sqlite ファイルではなく、コードでデータを作成します。

于 2012-04-18T10:17:31.283 に答える
1

メディア ファイルの場合は、Caches/ ディレクトリに保存します。アプリケーションの起動時に、それらが存在するかどうかを確認します。それ以外の場合、イメージはバンドルからロードされるか (この場合は解凍されます)、この場合はサーバーから再ダウンロードされます。

正確な場所は

NSString *mediaDir = [NSString stringWithFormat:@"%@/Library/Caches/%@", NSHomeDirectory(), MEDIA_DIRECTORY];

これは、一時ファイルを保存する必要がある場所です。キャッシュ内のファイルは一般に、Temp よりも永続的ですが、ある時点で削除できます。

于 2012-04-26T16:10:02.323 に答える