阻止文件不被上传到iCloud-b

有空用下

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

http://www.ooso.net/archives/617

http://blog.csdn.net/theonezh/article/details/7711749

https://gist.github.com/4527957

如何阻止文件被iTunes和iCloud同步 How do I prevent files from being backed up to iCloud and iTunes?

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"属性。这两个位置的数据在低存储空间时都会保留,而"do not backup"属性会阻止iTunes或iCloud备份。应用不再需要离线数据文件时,应该尽快删除,以避免浪费用户的存储空间。ce.

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

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

设置扩展属性
#include
- (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;
}

苹果在iOS 5系统时,对app的文件存储提出了新的要求。从它的guildline来看,是推荐开发者尽量把app生成的文件放在Caches目录下的。原文如下:

Only user-generated data or that cannot otherwise be recreated by your application, should be stored in the /Documents directory and rest should be stored to /Library/Caches directory。

照做会怎么样?

如果这么做的话,会出现两种情况

  1. 如果对此置之不理,继续把应用生成的文件放在Documents目录下,那么这些文件会被备份到iTunes或者iCloud。如果这些文件很大,那么用户可能需要为了同步消耗不少流量,然后苹果可能会因此拒绝你的应用上架,这是一个悲剧。
  2. 如果开发者照Apple说的干,把应用生成的文件放在Caches目录下,那么苹果不会拒绝你的应用,很happy。但是iOS 5会在磁盘空间紧张的时候删除Caches目录下的文件,这对用户来说可能是一个更大的悲剧。

如何应对新的文件存储策略?

开发者在这时陷入了两难的境地,但是到了iOS 5.0.1的时候,开发者多了第三种选择:

  • 继续把文件存储在Documents目录下,但是标记这些文件为不需要备份。详情请参考 technote (QA1719)

原文如下:

Q: My app has a number of files that need to be stored on the device permanently for my app to function properly offline. However, those files do not contain user data and don’t need to be backed up. How should I store those files in iOS 5?

A: Starting in iOS 5.0.1 a new “do not back up” file attribute has been introduced allowing developers to clearly specify which files should be backed up, which files are local caches only and subject to purge, and which files should not be backed up but should also not be purged. In addition, setting this attribute on a folder will prevent the folder and all of its contents from being backed up.

代码示例

给文件加上”do not back up”属性的代码如下,需要注意这个是iOS 5.0.1才有效,低于这个版本就别费劲了。

#include   - (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; }

//设置扩展属性

#include

- (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;

}

You can put data in Documents folder but before keep in documents folder create a folder within Documents folder suppose namely temp. Then write the following code to not backup in iCloud.

[[NSFileManager defaultManager] createDirectoryAtPath:temp
                          withIntermediateDirectories:NO
                                           attributes:nil
                                                error:nil];
NSURL *dbURLPath = [NSURL URLWithString:temp];
[self addSkipBackupAttributeToItemAtURL:dbURLPath];
Also implement the method addSkipBackupAttributeToItemAtURL do not forget to include
#include

- (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;
}

iOS的文件分类、存放路径及文件属性

关键数据

内容:用户创建的数据文件,无法在删除后自动重新创建,且会

路径:主目录/Documents

属性:不要设置"不备份"

管理:iOS系统即时遇到存储空间不足的情况下,也不会清除,同时会备份到iTunes或iCloud中

缓存数据 

内容:可用于离线环境,可被重复下载重复生成,即时在离线时缺失,应用本身也可以正常运行

路径:主目录/Library/Caches

属性:默认

管理:在存储空间不足的情况下,会清空, 并且不会被自动备份到iTunes和iCloud中

临时数据

内容:应用运行时,为完成某个内部操作临时生成的文件

路径:主目录/tmp

属性:默认

管理:随时可能被iOS系统清除,且不会自动备份到iTunes和iCloud,尽量在文件不再使用时,应用自己情况,避免对用户设备空间的浪费

离线数据

内容:与缓存数据类似,可以被重新下载和重建,但是用户往往希望在离线时数据依然能够托托地存在着

目录:主目录/Documents  或 主目录/Library/自定义的文件夹

属性:放于Documents下不需设置,放在自定义文件夹中需设置"不备份"

管理:与关键数据类似,即时在存储空间不足的情况下也不会清楚,应用自己应该清除已经不再使用的文件,以免浪费用户设备空间

从iOS5.0.1引入的设置不要备份文件(文件夹也适用)的扩展属性

from being backed up to iCloud and iTunes?

分类: iphone开发 2012-03-23 11:28 452人阅读 评论(0) 收藏 举报

先阅读官方说明:

https://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官方文档,

stackoverflow问答:http://stackoverflow.com/questions/8694112/adding-the-do-not-backup-attribute-to-a-folder-hierarchy-in-ios-5-0-1

时间: 2024-10-08 06:51:38

阻止文件不被上传到iCloud-b的相关文章

WEB版一次选择多个文件进行批量上传(Plupload)的解决方案

WEB版一次选择多个文件进行批量上传(Plupload)的解决方案 转载自http://www.cnblogs.com/chillsrc/archive/2013/01/30/2883648.html 说明:Plupload支持多种浏览器,多种上传方式! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 windows程序一样,一次选择多个文件进行批量上传.这样在某些应用上就显得很不人性化,有时候客户希

MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件02-多文件上传

上一篇中,使用客户端jJSAjaxFileUploader插件实现单文件异步上传,本篇实现多文件异步上传. 本篇源码在github,先看效果: ● 上传文件显示进度条. ● 停止上传按钮和关闭缩略图按钮. ● 限制上传文件的类型. ● 限制上传文件的尺寸. ●同时上传多个文件成功后显示缩略图.文件名: ● 点击界面上的删除按钮,界面删除,同步删除文件夹中文件. ● 再点击上传文件,界面追加一行新的缩略图.文件名.删除按钮: □ HomeController 把上传的文件名改成以GUID命名的格式

PHP上传文件时无法上传成功,$_FILES['screenshot']['tmp_name']为空

最近在学习<HeadFirst PHP & MySQL>一书的第5章"使用存储在文件中的数据",做一个文件上传的应用时,出现了错误,就是文件无法成功上传.这个问题困扰了我很久,不过还好最后终于解决了.原因是我上传的图片文件大小超过了HTML 表单中 MAX_FILE_SIZE 选项指定的值32768Bytes即32KB导致无法上传成功. 我使用了XAMPP(Apache + MySQL + PHP + Perl)集成开发包和Zend Studio 10.6作为PHP

【Android实战】----基于Retrofit实现多图片/文件、图文上传

一.再次膜拜下Retrofit Retrofit无论从性能还是使用方便性上都很屌!!!,本文不去介绍其运作原理(虽然很想搞明白),后面会出专题文章解析Retrofit的内部原理:本文只是从使用上解析Retrofit实现多图片/文件.图文上传的功能. 二.概念介绍 1)注解@Multipart 从字面上理解就是与多媒体文件相关的,没错,图片.文件等的上传都要用到该注解,其中每个部分需要使用@Part来注解..看其注释 /** * Denotes that the request body is m

[转]用C#如何实现大文件的断点上传

最近做在做一个项目,涉及到文件上传的问题. 以前也做过文件上传.但都是些小文件,不超过2m. 这次要求上传1g以上的东西. 没办法找来资料研究了一下. 基于web的文件上传可以使用ftp和http两种协议,用ftp的话虽然传输稳定,但安全性是个严重的问题,所以没有考虑. 剩下只有http. 在http中有3种方式,put.webdav.rfc1867,前2种方法不适合大文件上传,在这里也不说了. 确定使用rfc1867格式处理之后开始分析流行的上传组件.看了n多代码之后发现,目前无组件程序和一些

文件无刷新上传并获取保存到服务器端的路径(swfUpload与uploadify)

文件无刷新上传并获取保存到服务器端的路径 遇到上传文件的问题,结合之前用到过的swfUpload,又找了一个无刷新上传文件的jquery插件uploadify,写篇博客记录一下分别介绍这两个的实现方法 swfUpload 导入swfUpload的开发包 添加js引用,引用swfUpload.js与handler.js文件,如果对swfUpload不了解.有疑问可以看看这篇博客 页面初始化 修改handler.js文件中 上传成功的事件,serverData是服务器端的响应 Uploadify 导

Ubuntu下Filezilla 无法上传某些文件或者已经上传的文件名显示为乱码

Ubuntu下使用Filezilla与Windows文件服务器传输文件出现无法上传某些文件或者已经上传的文件名显示为乱码的情况,还有以前遇到过 用filezilla从自设的windows远程机上上传下载文件,可是在远程机上明明存在的一些文件却无法显示,通过网上搜索才知道更准确的说法是"FileZilla无法显示中文文件名",当文件多时也许会出现这样的规律. 解决方案是设置字符,将默认的自动检测更改为使用自定义的字符集gb2312: FileZilla无法显示中文文件名该如何设置(图)

[Plugin] WEB版一次选择多个文件进行批量上传(swfupload)的解决方案

URL:http://www.cnblogs.com/chillsrc/archive/2010/02/21/1670594.html 说明:功能完全支持ie和firefox浏览器! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 windows程序一样,一次选择多个文件进行批量上传.这样在某些应用上就显得很不人性化,有时候客户希望能够一次选择很多文件,然后让系统把选择的文 件全部上传. 这里,就将针

使用HttpRequest.Files 获取上传文件,实现上传附件功能

使用HttpRequest.Files 获取上传文件,实现上传附件功能,不同浏览器会有差异: 获得在 Google 浏览器上传后得到的 HttpRequest.Files  (客户端上载文件的集合) 单个文件查看:对应的FileName 是上传文件的原始文件名:例:开发管理手册2017版.docx 获取IE浏览器上传后HttpRequest.Files: 单个文件查看:对应的FileName 是上传文件 带路径的文件名 例:C:\\Users\\XXX\\Desktop\\开发管理手册2017版