2

我读过我可以用 ios 5.1 及更高版本标记具有“不备份”属性的文件夹

据我了解,在这种情况下,目录的所有内容都将从备份中排除。

在我的应用程序中,我们需要从备份中排除 Documents 目录中的所有文件(这些文件可以在应用程序执行期间从 Documents 中添加或删除)。我需要将我们的文件存储在 Documents 目录中。

我可以用“不备份属性”标记文档目录吗?

苹果允许这样做吗?

这会成为拒绝我们应用的理由吗?

4

4 回答 4

6

是的,您可以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;
    }
}
于 2013-05-01T12:44:37.483 回答
2

首先,把这个贴在苹果内部论坛上,看看你能不能让苹果工程师做出回应,我对此表示怀疑。问题是即使它今天有效,它也可能在以后中断。

建议:

1)在Documents中创建一个文件夹,标记它,然后只在其中存储文件。

2)向您的应用程序委托添加一个方法,该方法采用文件名参数,然后在调用时定位文件并标记它。在这种情况下,您需要确保在每次文件创建操作后调用它。

于 2013-05-01T12:00:11.637 回答
1

从 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;
}
于 2014-07-15T17:57:17.033 回答
1
    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
}
于 2016-07-05T15:16:06.510 回答