iOS数据存储指南拒绝

时间:2012-04-18 09:22:39

标签: ios iphone appstore-approval

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

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

我还读过这个方法只适用于高于5.0.1的ios,另一方面它会被忽略(我已经将我的ios部署目标设置为4.3)...如果我使用这个方法我的应用程序将再次被拒绝,因为旧的ios设备备份不受管理?如果是,有一个cross-iosversion方法来设置NSURLIsExcludedFromBackupKey?

EDIT 对不起icloud在ios 5.0之前不存在所以我认为问题只涉及版本5.0和5.0.1之间的差异,我错了?

4 个答案:

答案 0 :(得分:3)

我已通过此方法传递了将存储在documents文件夹中的所有文件。

试试这个

-(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中找到了这个方法:

答案 1 :(得分:3)

注意: 不要使用

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

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

NSArray* lCachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* lCacheDirectory = [lCachePaths objectAtIndex:0];

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

确切的位置是

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

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