Here are the trade-offs:
- If you put your files in the Documents directory then they are backed up to iTunes or iCloud but if they are too big and it's possible to download the files again then Apple may reject your app
- If you put your files in the Cache directory then they won't be backed up and Apple won't reject your app. However, when iOS 5 gets low on space it may delete all the files in there.
However, with iOS 5.0.1 there is a third option:
- Put files in Documents but flag them so that they are not backed up. There's a technote (QA1719) on how to do this.
I think this is probably the best answer for you.
@font-face { font-family: "Times"; }@font-face { font-family: "宋体"; }@font-face { font-family: "宋体"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "Calibri"; }@font-face { font-family: "Cambria"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 12pt; font-family: Cambria; }h1 { margin-right: 0cm; margin-left: 0cm; font-size: 24pt; font-family: Times; font-weight: bold; }h2 { margin: 13pt 0cm; text-align: justify; line-height: 173%; page-break-after: avoid; font-size: 16pt; font-family: Calibri; font-weight: bold; }h4 { margin: 14pt 0cm 14.5pt; text-align: justify; line-height: 156%; page-break-after: avoid; font-size: 14pt; font-family: Calibri; font-weight: bold; }a:link, span.MsoHyperlink { color: blue; text-decoration: underline; }a:visited, span.MsoHyperlinkFollowed { color: purple; text-decoration: underline; }p { margin-right: 0cm; margin-left: 0cm; font-size: 10pt; font-family: Times; }code { font-family: Courier; }pre { margin: 0cm 0cm 0.0001pt; font-size: 10pt; font-family: Courier; }span.contenttext { }p.codesample, li.codesample, div.codesample { margin-right: 0cm; margin-left: 0cm; font-size: 10pt; font-family: Times; }span.HTML { font-family: Courier; }.MsoChpDefault { font-family: Cambria; }div.WordSection1 { page: WordSection1; }
How do I prevent files from being backed up to iCloud and iTunes?
Technical Q&A QA1719
How do I prevent files from being backed up to iCloud and iTunes?
Q: My app has a number of files that need to be stored on the device permanently for my app to function properly offline. However, those files do not contain user data and don't need to be backed up. How can I prevent them from being backed up?
A: On iOS, apps are responsible for ensuring that only user data and not application data is backed up to iCloud and iTunes. The exact steps necessary vary between iOS version, so this QA will describe the process for each version of iOS. For more information on exactly what data should or should not be backed up, see the App Backup Best Practices section of the iOS App Programming Guide.
Important: Apps should avoid mingling app data and user data in the same file. Doing so will unnecessarily increase backup sizes and can be considered a violation of the iOS Data Storage Guidelines.
iOS 5.1 and later
Starting in iOS 5.1, apps can use either NSURLIsExcludedFromBackupKey or kCFURLIsExcludedFromBackupKey file properties to exclude files from backups. Either of these APIs is preferred over the older, deprecated approach of directly setting an extended attribute. All apps running on iOS 5.1 should use these APIs to exclude files from backups.
Listing 1 Excluding a File from Backups on iOS 5.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; |
} |
Back to Top
iOS 5.0.1
If your app must support iOS 5.0.1, you can use the following method to set the "do not back up" extended attribute. Whenever you create a file or folder that should not be backed up, write the data to the file and then call this method, passing in a URL to the file.
Warning: The code that follows has been deprecated and should only be used on iOS 5.0.1 or earlier. When running in iOS 5.1, apps should use the NSURL
and CFURL
keys described above.
Listing 2 Setting the Extended Attribute on iOS 5.0.1
#import <sys/xattr.h> |
- (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; |
} |
Back to Top
iOS 5.0
It is not possible to exclude data from backups on iOS 5.0. If your app must support iOS 5.0, then you will need to store your app data in Caches
to avoid that data being backed up. iOS will delete your files from the Caches
directory when necessary, so your app will need to degrade gracefully if it's data files are deleted.
Back to Top
Document Revision History
Date |
Notes |
2012-04-23 |
Updated for iOS 5.1 |
2011-11-10 |
-Fixed critical bug in code snippet. |
|
New document that describes how an app can prevent files from being backed up to iCloud and iTunes. |