iOS 8 OTA升级后NSFileProtectionKey被删除?

问题描述:

在iOS 8 OTA从iOS 7升级之后,我们发现attributesOfItemAtPath为特定文件显示了不同的值,因为NSFileProtectionKey在升级过程中被删除。iOS 8 OTA升级后NSFileProtectionKey被删除?

其他人看到这个?这个变化的范围是什么?

+0

这是一个文件或目录那也有NSURLIsExcludedFromBackupKey属性? – quellish 2014-09-19 01:56:51

+0

是的,这是正确的。这会如何影响它? – Blaze 2014-09-19 16:32:31

当App Store下载更新时,它将安装到新的目录中,然后再转移先前安装的文件。 Files inside these application directories are migrated:在其他位置

Documents

Library

文件可能会或可能不会被迁移。升级后,应用程序不应该依赖其他文件。 当iOS检测到磁盘空间不足的情况时,它会选择清除哪些文件。 NSCachesDirectoryNSTemporaryDirectory()中的文件可以清除。带有“不备份”属性(NSURLIsExcludedFromBackupKey/kCFURLIsExcludedFromBackupKey)的文件或目录将不会被清除,您的应用程序负责清除它们。 From the iOS Data Storage Guidelines

即使在低存储情况下,也可以使用“不备份”属性来指定应保留在设备上的文件。将此属性与可重新创建的数据一起使用,但即使在存储情况较少的情况下也需要持续保存,以便您的应用正常运行,或者因为客户希望在脱机使用期间可以使用该数据。此属性适用于标记的文件,而不管它们在哪个目录中,包括Documents目录。这些文件不会被清除,也不会被包含在用户的iCloud或iTunes备份中。由于这些文件确实使用设备上的存储空间,因此您的应用程序负责定期监控和清除这些文件。

有关于这个属性在NSURL.h一个重要的注意事项:

真,如果资源应该从备份中排除,否则为false(读写,值boolean类型的NSNumber)。此属性仅用于排除备份中不需要的缓存和其他应用程序支持文件。通常对用户文档进行的某些操作将导致此属性重置为false,因此不应在用户文档上使用此属性。

当此属性与NSFileProtectionKey组合使用时,可能会导致未定义的行为。备份属性由一个子系统读取和写入,而文件保护密钥由另一个子系统使用。在应用程序升级或恢复过程中,可能会迁移或恢复文件,而无需保留文件保护值的属性。此外,将数据保护属性添加到文件将用受保护的文件替换旧文件。这对您的应用程序是透明的,但可能会有升级或恢复的副作用将未受保护的版本置于原位。这是无论何时应用程序写入文件时都建议设置此属性的许多原因之一。

+0

我做了一些测试,发现在低存储条件下,NSURLIsExcludedFromBackupKey文件不会被清除。 – Blaze 2014-09-21 16:25:34

+0

@布莱泽,你是对的,我有逻辑翻转。在我最初写这篇文章的时候,相关的文档不可用。答案已更新。 – quellish 2014-09-21 17:53:01

+0

对不起,但我不相信这些引用文件澄清了为什么'NSFileProtectionKey'被重置。第二个引用涉及一些_writes_ to _user documents_导致DoNotBackup标志被重置。但是,在我的情况下,'NSFileProtectionKey'被重置为'Library/Application Support'下的文件,这是一个文档明确提到的位置。 – 2016-03-15 20:52:12

我不认为有任何官方答复或文件适用。

有趣的是,在我的情况下,应用程序升级时,在iOS 9和8上,Library/Application Support下的文件已被设置为NSFileProtectionComplete

seeems由数据保护引起的被设置来完成对应用程序ID在苹果的服务器上,这反过来又似乎已被Xcode的,当它再生换证后配置的配置文件自动更新(尽管在本地Xcode项目中数据保护功能关闭)。

这实际上是有道理的。在启用新版本的数据保护权利后,iOS会安全地处理并升级所有文件上的数据保护。

什么是没有意义的是,当别人(ahem Xcode ahem)决定为您添加该权利时。

事情添加到释放清单:

  • 重新检查你的App ID对证书的门户网站的设置(特别注意数据保护设置)