我读过我可以用 ios 5.1 及更高版本标记具有“不备份”属性的文件夹
据我了解,在这种情况下,目录的所有内容都将从备份中排除。
在我的应用程序中,我们需要从备份中排除 Documents 目录中的所有文件(这些文件可以在应用程序执行期间从 Documents 中添加或删除)。我需要将我们的文件存储在 Documents 目录中。
我可以用“不备份属性”标记文档目录吗?
苹果允许这样做吗?
这会成为拒绝我们应用的理由吗?
我读过我可以用 ios 5.1 及更高版本标记具有“不备份”属性的文件夹
据我了解,在这种情况下,目录的所有内容都将从备份中排除。
在我的应用程序中,我们需要从备份中排除 Documents 目录中的所有文件(这些文件可以在应用程序执行期间从 Documents 中添加或删除)。我需要将我们的文件存储在 Documents 目录中。
我可以用“不备份属性”标记文档目录吗?
苹果允许这样做吗?
这会成为拒绝我们应用的理由吗?
是的,您可以do not backup
为 Document 目录的文件夹(文件)设置标志。
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
}