我的应用被拒绝,因为它必须遵循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之间的差异,我错了?
答案 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,但可以在某些时候删除。