Question

By uploading the app to the app store have given me this error.

2.23: Apps must follow the iOS Data Storage Guidelines or They Will be rejected

I've been watching what is wrong is that one of the files I'm using does not meet the storage requirements.

To be more specific it is a sqlite for loading maps offlines mode with route-me library.

I am using sqlite for loading map in offline mode, it seems that this map is stored as backup in iCloud, so I'm skipping storage restrictions.

Do not know how to say that this copy is not created in iCloud.

The code is as follows:

[[RMDBMapSource alloc] initWithPath: @ "map.sqlite"]; 

The file size is 23MB

any ideas?

Was it helpful?

Solution

Most probably you are storing your "map.sqlite" in your application's Documents directory. Sqlite files are normally copied to Documents directory so that they are writable. But iOS, by default, tries to copy or backup all the files in Documents directory to iCloud (if iCloud backup is turned on). Therefore, according to Apple's guidelines, you can do the following so that your database file is not backed up by iCloud from your Documents directory.

You can call the following function to pass the path of your "map.sqlite" as NSURL:

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath];
[self addSkipBackupAttributeToItemAtURL:url];

The function is provided in Apple as:

- (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;
}

This function makes sure that the file (provided as URL) is not backed up by iCloud.

You can also put your database files in a separate directory inside Documents directory and mark that whole subdirectory as 'do not backup' by calling this function. Hope it helps.

OTHER TIPS

Basically, it depends on the kind of data you are storing.

If the data can be regenerated (when a user install the app on another device, for instance), then it should not be backed up.

Otherwise, iCloud backup is OK, as the user will expect his data to be available, even on another device.

In the first scenario, you have basically two ways of achieving this...

Either you use NSURL to set the kCFURLIsExcludedFromBackupKey on your files, either you store them in a location that won't be backed-up, like <Application_Home>/Library/Caches. Note that the second solution is the better, IMHO.

For info, kCFURLIsExcludedFromBackupKey can be used this way:

NSURL * fileURL;

fileURL = [ NSURL fileURLWithPath: @"some/file/path" ];

[ fileURL setResourceValue: [ NSNumber numberWithBool: YES ] forKey: NSURLIsExcludedFromBackupKey error: nil ];

For the second scenario, sometimes Apple reviewers think your data can be re-generated, when it's not. Then you'll have to explain why the data has to be backed-up.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top