5

我的应用程序被拒绝,因为它必须遵循 iOS 数据存储指南。我已经在stackoverflow上阅读了一些答案,并且我已经阅读了一些博客......我知道我的问题,在第一次应用程序启动时我复制1个sqlite db并解压缩文档文件夹中的一些图像。问题是 icloud 自动备份文档目录中的任何文件。我不需要在我的应用程序中使用 icloud,但我的文件必须保留在文档文件夹中,因为它们是我的应用程序的基础数据并且必须保留(缓存文件夹或临时文件夹不是正确的解决方案)。所以我读到了一个标志,我可以逐个文件设置以禁止备份:

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

我还读到此方法仅适用于高于 5.0.1 的 ios,在另一种情况下它将被简单地忽略(我已将我的 ios 部署目标设置为 4.3)...如果我使用此方法,我的应用程序将再次被拒绝因为旧的 ios 设备备份不受管理?如果是,是否有一个跨 iosversion 方法来设置 NSURLIsExcludedFromBackupKey?

编辑我很抱歉 icloud 在 ios 早期 5.0 中不存在所以我认为问题只涉及版本 5.0 和 5.0.1 之间的差异,我错了吗?

4

4 回答 4

3

我已经通过这种方法传递了将存储在文档文件夹中的所有文件。

试试这个

-(BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{

const char* filePath = [[URL path] fileSystemRepresentation];
const char* attrName = "com.apple.MobileBackup";
if (&NSURLIsExcludedFromBackupKey == nil) {
    // iOS 5.0.1 and lower
    u_int8_t attrValue = 1;
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;

}
else {
    // First try and remove the extended attribute if it is present
    int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0);
    if (result != -1) {
        // The attribute exists, we need to remove it
        int removeResult = removexattr(filePath, attrName, 0);
        if (removeResult == 0) {
            NSLog(@"Removed extended attribute on file %@", URL);
        }
    }

    // Set the new key
    NSError *error = nil;
    [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    return error == nil;
}
}

我在 Stack Overflow 中找到了这个方法:

于 2012-04-26T16:01:29.463 回答
3

注意:不要使用

NSString *mediaDir = [NSString stringWithFormat:@"%@/Library/Caches/%@", NSHomeDirectory(), MEDIA_DIRECTORY];

因为您正在对名称进行假设。相反,使用:

NSArray* lCachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* lCacheDirectory = [lCachePaths objectAtIndex:0];
于 2012-05-28T06:29:29.413 回答
1

在我的应用程序中,我通过将文件(在我的情况下为图像)添加到包中来解决它,并检查加载图像的方法(如果它们存在于将放置用户生成的数据/图像的文件夹中)。

如果它不存在,我知道它是我预先填充的图像之一,我从包中加载它。

对于 sqlite 文件:不是一个真正令人满意的解决方案,但我现在在代码中创建数据,而不是预先填充的 sqlite 文件。

于 2012-04-18T10:17:31.283 回答
1

对于媒体文件,我们将它们存储在 Caches/ 目录中。在应用程序启动期间,我们检查它们是否存在。否则,图像要么从捆绑包中加载(在您的情况下为解压缩),要么在我们的情况下从服务器重新下载。

确切位置是

NSString *mediaDir = [NSString stringWithFormat:@"%@/Library/Caches/%@", NSHomeDirectory(), MEDIA_DIRECTORY];

这是您应该存储临时文件的地方。缓存中的文件通常是持久的,比 Temp 中的要持久得多,但可以在某些时候删除。

于 2012-04-26T16:10:02.323 回答