违反AppStore第2.23条(数据被iCloud备份而被拒)

2.23

 

We found that your app does not follow the iOS DataStorage Guidelines, which is required per the App Store Review Guidelines.

 

In particular, we found that on launch and/or contentdownload, your app stores 5.27MB. To check how much data your app is storing:

 

- Install and launch your app

- Go to Settings > iCloud > Storage & Backup> Manage Storage

- If necessary, tap “Showall apps

- Check your app’sstorage

 

The iOS Data Storage Guidelines indicate that onlycontent that the user creates using your app, e.g., documents, new files,edits, etc., should be backed up by iCloud.

 

Temporary files used by your app should only be stored inthe /tmp directory; please remember to delete the files stored in this locationwhen the user exits the app.

 

Data that can be recreated but must persist for properfunctioning of your app– or because customersexpect it to be available for offline use– should bemarked with the “do not back up” attribute. For NSURL objects, add the NSURLIsExcludedFromBackupKeyattribute to prevent the corresponding file from being backed up. For CFURLRefobjects, use the corresponding kCFURLIsExcludedFromBackupKey attribute.

 

For more information, please see Technical Q&A 1719:How do I prevent files from being backed up to iCloud and iTunes?.

 

It is necessary to revise your app to meet therequirements of the iOS Data Storage Guidelines.

 

研究一翻,找到如下的一些资料。。。

 

http://www.cocoachina.com/bbs/read.php?tid=86244

 

iOS Data Storage Guidelines 和 “do not back up”文件属性

 

iOS 5有了iCloud后,Apple更新了数据存储指导方针,以适应于iCloud存储,同时增加了“不要备份”文件属性,可以指定文件不备份和上传到iCloud

 

摘录如下,供大家参考:

 

iOS 数据存储指导方针

 

iCloud包括了备份,会通过Wi-Fi每天自动备份用户iOS设备。app的home目录下的所有东西都会被备份,除了应用Bundle本身、缓存目录和temp目录。已购买的音乐、应用、书籍、Camera Roll、设备设置、主屏幕、App组织、消息、铃声也都会被备份。由于备份通过无线进行,并且为每个用户存储在iCloud中,应用需最小化自己存储的数据数量。大文件会延长备份时间,并且消耗用户的可用iCloud空间。

 

为了确保备份尽可能快速高效,应用存储数据需要遵循以下指导方针:

 

1. 只有那些用户生成的文档或其它数据,或者应用不能重新创建的数据,才应该存储在/Documents目录下,并且会被自动备份到iCloud。

 

2. 可以重新下载或生成的数据,应该存储在/Library/Caches目录。例如数据库缓存文件、可下载文件(杂志、报纸、地图应用使用的数据)等都属于这一类。

 

3. 临时使用的数据应该存放在/tmp目录。尽管这些文件不会被iCloud备份,应用在使用完之后需要记得删除这些文件,这样才不会继续占用用户设备的空间。

 

4. 使用”不要备份”属性来指定那些需要保留在设备中的文件(即使是低存储空间情况下)。那些能够重新生成,但在低存储空间时仍需保留,对应用正常运行有影响,或者用户希望文件在离线时可用的文件,需要使用这个属性。无论哪个目录下的文件(包括Documents目录),都可以使用这个属性。这些文件不会被删除,也不会包含在用户的iCloud或iTunes备份中。由于这些文件一直占用着用户设备的存储空间,应用有责任定期监控和删除这些文件。

 

iOS 5.0.1开始支持”do not back up”文件属性,允许开发者明确地指定哪些文件应该被备份,哪些是本地缓存可以自动删除,哪些文件不需要备份但不能删除。此外,对目录设置这个属性,会阻止备份该目录和目录中的所有内容。

 

注意”do not back up”属性只能用于iOS 5.0.1以后版本。之前版本的应用需要存储数据到/Library/Caches目录才能避免被备份。由于老的系统忽略这个属性,你需要确保应用在所有iOS版本中,都遵循上面的iOS Data Storage Guidelines。

 

数据处理分类

com.apple.MobileBackup文件属性就是iOS 5.0.1引入的”do not back up”特性,用于指定文件或目录不需要备份(不管在文件系统的什么位置)。通过使用这个新的文件属性,并且将文件存放在指定的目录下,文件可以分为以下四种数据类型:s.

 

关键数据

这些是用户创建的数据,或其它不能重新生成的数据。应该存放在/Documents目录下,并且不应该标记为”do not backup”属性。关键数据在低存储空间时也会保留,而且会被iCloud或iTunes备份。

 

缓存数据

可以重新下载或生成的数据,而且没有这些数据也不会妨碍用户离线使用应用的功能。缓存数据应该保存在/Library/Caches目录下。缓存数据在设备低存储空间时可能会被删除,iTunes或iCloud不会对其进行备份。

 

临时数据

应用需要写到本地存储,内部使用的临时数据,但不需要长期保留使用。临时数据应该保存在/tmp目录。系统可能会清空该目录下的数据,iTunes或iCloud也不会对其进行备份。应用在不需要使用这些数据时,应该尽快地删除临时数据,以避免浪费用户的存储空间。

 

离线数据

可以下载,或重新创建,但用户希望在离线时也能访问这些数据。离线数据应该存放在/Documents目录或/Library/Private Documents目录,并标记为”do not backup”属性。这两个位置的数据在低存储空间时都会保留,而”donot backup”属性会阻止iTunes或iCloud备份。应用不再需要离线数据文件时,应该尽快删除,以避免浪费用户的存储空间。ce.

 

设置DoNot Backup扩展属性

注意:”do not backup”扩展属性可以添加到任何文件或目录,在旧版本的系统中也能够设置。但旧系统仍然会备份这些文件,一旦设备更新到iOS 5.0.1,这些文件会被重新正确地配置。

 

使用下面方法来设置”do not back up”扩展属性。当你创建不需要备份的文件或目录时,向文件写入数据,然后调用下面方法,并传递一个文件URL。

 

以下代码来自melon亲,在这里表示感谢

//设置云同步

+(void)addNotBackUp{

 

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

 

NSString *documentsDirectory = [paths objectAtIndex:0];

 

NSString *folderPath = [documentsDirectorystringByAppendingPathComponent:APP_NAME];

 

NSURL *url = [NSURL URLWithString:folderPath];

 

[self addSkipBackupAttributeToItemAtURL:url];

 

}

//设置云同步

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

 

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;

}

 

这是官方的解决方法

 

http://developer.apple.com/library/ios/#qa/qa1719/_index.html





总结二


先阅读官方说明:

使用方法:
#import “sys/xattr.h”

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
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;
}

- (void)addSkipBackupAttributeToPath:(NSString*)path {
u_int8_t b = 1;
setxattr([path fileSystemRepresentation], “com.apple.MobileBackup”, &b, 1, 0, 0);
}

对文件夹的path使用这两个方法中的任意一个,就可以使该目录和该目录包含的所有文件和文件夹不被icloud和itunes同步了!
对于数据的同步与否的设计规则 详细看上面的官方说明链接。
注意:setxattr在iOS 5.0.1之前的系统里不会起作用的,(但是那些系统也没有iCloud只有iTunes^.^)。经测试发现虽然不会起作用,但调用该函数也不会引起空指针错误。  这是一项挺有意思的技术:新系统里加入了原先系统里没有的func,在原先的系统里调用,居然没有nullpoint错误。 莫非这函数地址早就存在,预留好了后面把功能挂上? 奇怪了。
另外补充一下,对这个特性的测试要有耐心,因为icloud识别应用程序里要同步的数据量大小显示要等几秒(菊花。。),
参考文档:apple官方文档,


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值