iOS 8 OTA升级后NSFileProtectionKey是否被删除?

iOS 8 OTA升级后NSFileProtectionKey是否被删除?,ios,ios8,Ios,Ios8,在一个应用程序上,从iOS 7升级到iOS 8 OTA后,我们注意到AttributeFiteMatPath显示了特定文件的不同值,因为升级过程删除了NSFileProtectionKey 还有人看到这个吗?此更改的范围是什么?当应用商店下载更新时,它将被安装到一个新目录中,然后再从以前的安装转移文件: 文档 库 其他位置的文件可能会被迁移,也可能不会被迁移。您的应用程序不应依赖于升级后存在的其他文件。 当iOS检测到磁盘空间不足时,它会选择要清除的文件。可以清除NSCachesDirector

在一个应用程序上,从iOS 7升级到iOS 8 OTA后,我们注意到AttributeFiteMatPath显示了特定文件的不同值,因为升级过程删除了NSFileProtectionKey


还有人看到这个吗?此更改的范围是什么?

当应用商店下载更新时,它将被安装到一个新目录中,然后再从以前的安装转移文件:

文档

其他位置的文件可能会被迁移,也可能不会被迁移。您的应用程序不应依赖于升级后存在的其他文件。 当iOS检测到磁盘空间不足时,它会选择要清除的文件。可以清除
NSCachesDirectory
NSTemporaryDirectory()
中的文件。具有“不备份”属性的文件或目录(
NSURLIsExcludedFromBackupKey
/
kCFURLIsExcludedFromBackupKey
)将不会被清除,您的应用程序将负责清除它们:

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

NSURL.h中有一个关于此属性的重要注释:

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


当此属性与
NSFileProtectionKey
结合使用时,可能会导致未定义的行为。备份属性由一个子系统读取和写入,而文件保护密钥由另一个子系统使用。在应用程序升级或还原期间,可以迁移或还原文件,而不保留文件保护值的属性。此外,向文件添加数据保护属性将用受保护的文件替换旧文件。这对您的应用程序是透明的,但可能会产生副作用,即升级或恢复未受保护的版本。这是建议在应用程序写入文件时设置此属性的众多原因之一。

我不相信有任何官方答案或文档适用

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

这似乎是由于苹果服务器上的应用程序ID上的数据保护被设置为完成,而Xcode在证书续订后重新生成配置文件时似乎自动更新了该ID(尽管本地Xcode项目中的数据保护功能已关闭)

这实际上是有道理的。iOS保证安全,并在您为新版本启用数据保护权限后,负责升级所有文件的数据保护

当其他人(ahem Xcode ahem)决定为您添加该权利时,就没有意义了

要添加到发布清单中的内容:

  • 重新检查证书门户上应用程序ID的设置(特别注意数据保护设置)

此文件或目录是否也具有NSURLIsExcludedFromBackupKey属性?是的,这是正确的。这会产生怎样的影响?我做了一些测试,发现在低存储条件下,带有nsurlisecludedfrombackupkey的文件不会被清除。@Blaze,你是对的,我把逻辑颠倒了。在我写这篇文章的时候,相关的文档是不可用的。答案已更新。抱歉,但我不相信这些引文澄清了
NSFileProtectionKey
重置的原因。第二篇引文讨论了对用户文档的一些写入,导致DoNotBackup标志被重置。然而,在我的例子中,
NSFileProtectionKey
是为
库/应用程序支持下的文件重置的,文档中明确提到的一个位置很好。@AndreyTarantsov Technote 2285涵盖了应用程序更新用例的位置,本讨论中的位置是相同的<代码>库/
在应用程序沙箱中的迁移与
文档/
相同,但缓存子目录除外。@quellish是的,库的迁移与文档一样,但没有说明在迁移过程中属性将被重置。(反之亦然:移动文件不会改变任何元数据。iOS必须主动重置保护属性。)