我听说我可以在ios 5.1及以后的版本中将文件夹标记为"不备份"属性
据我所知,在这种情况下,目录中的所有内容都将被排除在备份之外。
在我的应用程序中,我们需要从备份中排除文档目录中的所有文件(文件可以在应用程序执行期间从文档中添加或删除)。我需要把我们的文件存储在Documents目录下。
我可以用"不备份属性"标记文档目录吗?
苹果允许这样做吗?
这会成为拒绝我们的应用程序的理由吗?
可以为Document目录下的文件夹(文件)设置do not backup
标志。
do not backup
属性适用于标记的文件,无论它们在哪个目录,包括Documents目录。这些文件不会被清除,也不会包含在用户的iCloud
备份中。因为这些文件使用设备上的存储空间,你的应用程序负责定期监控和清除这些文件。
要了解更多相同的信息,请访问此链接
下面的方法设置不备份标志,以避免不必要的备份|从应用程序目录(文档和缓存)删除。只需要调用下面的方法并传递文件夹(文件)的url。
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {
if (&NSURLIsExcludedFromBackupKey == nil) { // for iOS <= 5.0.1
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;
} else { // For iOS >= 5.1
NSError *error = nil;
[URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
return error == nil;
}
}
首先,把这个贴在苹果内部论坛上,看看你能不能得到苹果工程师的回复,我对此表示怀疑。问题是,即使它今天工作,它可能会坏了。
建议:
1)在Documents中创建一个文件夹,标记它,然后只在其中存储文件。
2)添加一个方法到你的应用程序委托,接受一个文件名参数,然后当被调用时定位文件并标记它。在本例中,您需要确保在每个文件创建操作之后调用它。
从Apple文档中,对于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;
}
func addSkipBackupAttributeToItemAtURL(filePath:String) -> Bool
{
let URL:NSURL = NSURL.fileURLWithPath(filePath)
assert(NSFileManager.defaultManager().fileExistsAtPath(filePath), "File (filePath) does not exist")
var success: Bool
do {
try URL.setResourceValue(true, forKey:NSURLIsExcludedFromBackupKey)
success = true
} catch let error as NSError {
success = false
print("Error excluding (URL.lastPathComponent) from backup (error)");
}
return success
}