看到发的应用被拒了,还是很郁闷的,下图为证:
发过一些IOS项目,但没发过需要从服务器下载大数量文件的项目。 ios验证人员认为我的应用在icloud上存储了近20M ,在浪费用户空间,
对此我深表遗憾。
查阅资料,发现自己确实没搞懂IOS的存储规则,http://www.cocoachina.com/bbs/simple/?t86244.html 这篇博文(规范翻译)讲的非常细致,
关键数据
这些是用户创建的数据,或其它不能重新生成的数据。应该存放在<Application_Home>/Documents目录下,并且不应该标记为"do not backup"属性。关键数据在低存储空间时也会保留,而且会被iCloud或iTunes备份。
缓存数据
可以重新下载或生成的数据,而且没有这些数据也不会妨碍用户离线使用应用的功能。缓存数据应该保存在<Application_Home>/Library/Caches目录下。缓存数据在设备低存储空间时可能会被删除,iTunes或iCloud不会对其进行备份。
临时数据
应用需要写到本地存储,内部使用的临时数据,但不需要长期保留使用。临时数据应该保存在<Application_Home>/tmp目录。系统可能会清空该目录下的数据,iTunes或iCloud也不会对其进行备份。应用在不需要使用这些数据时,应该尽快地删除临时数据,以避免浪费用户的存储空间。
离线数据
可以下载,或重新创建,但用户希望在离线时也能访问这些数据。离线数据应该存放在<Application_Home>/Documents目录或<Application_Home>/Library/Private Documents目录,并标记为"do not backup"属性。这两个位置的数据在低存储空间时都会保留,而"do not backup"属性会阻止iTunes或iCloud备份。应用不再需要离线数据文件时,应该尽快删除,以避免浪费用户的存储空间
而我下载的文件就存在了关键数据中,并且没有标记属性,所以icloud如果开启备份的话,会将<Application_Home>/Documents全部备份。当然如果是IOS5.0.1,就算你标记了 ,还是会被自动备份。
所以如果你的应用要适配到5.0,甚至是4.3,就要做好适配方案。
我的处理是:
1. 5.0.1以上都保存在 <Application_Home>/Documents内,并标记为do not back up , 5.0.1以下均保存到<Application_Home>/Library/Caches目录
2. 对于重要文件,并且较小,均可保存在<Application_Home>/Documents内。
部分代码:
if(function->isIosFiveUp()){
CCLog("平台大于5.0");
platformSavePath =
CCFileUtils::sharedFileUtils()->getWritablePath();
}else{
CCLog("平台小于等于5.0");
platformSavePath = function->getPlatformSavePath();
}
添加do not back up标签:
const char* attrName = "com.apple.MobileBackup"; u_int8_t attrValue = 1; setxattr(path.c_str(), attrName, &attrValue, sizeof(attrValue), 0, 0); // 该方法在 #include <sys/xattr.h> 不必调用其它的
添加标签,切记该文件是刚创建成功,并且处在关闭状态 ,否则标记失败。
do not back up IOS被拘处理