在应用程序上,从iOS 7升级iOS 8 OTA之后,我们注意到attributesOfItemAtPath为特定文件显示了不同的值,因为升级过程删除了NSFileProtectionKey。
其他人都看到了吗?这种变化的范围是什么?
答案 0 :(得分:0)
当App Store下载更新时,会在从先前安装中移动文件之前将其安装到新目录中。 Files inside these application directories are migrated:
Documents
Library
其他位置的文件可能会迁移也可能不会迁移。您的应用程序不应该依赖升级后存在的其他文件。
当iOS检测到磁盘空间不足时,它会选择要清除的文件。可以清除NSCachesDirectory
和NSTemporaryDirectory()
中的文件。使用"的文件或目录不备份"属性(NSURLIsExcludedFromBackupKey
/ kCFURLIsExcludedFromBackupKey
)不会被清除,您的应用程序负责清理它们。 From the iOS Data Storage Guidelines:
使用"不要备份"用于指定应保留在设备上的文件的属性,即使在低存储情况下也是如此。将此属性与可以重新创建的数据一起使用,但即使在低存储情况下也需要保留,以使应用程序正常运行,或者因为客户希望在脱机使用期间可以使用该数据。此属性适用于标记文件,无论它们位于何种目录中,包括Documents目录。这些文件不会被清除,也不会包含在用户的iCloud或iTunes备份中。由于这些文件确实使用了设备上的存储空间,因此您的应用程序负责定期监视和清除这些文件。
NSURL.h中有关于此属性的重要说明:
如果应从备份中排除资源,则为true,否则为false(读写,值类型为boolean NSNumber)。此属性仅用于排除备份中不需要的缓存和其他应用程序支持文件。通常对用户文档执行的某些操作将导致此属性重置为false,因此不应在用户文档上使用此属性。
当此属性与NSFileProtectionKey
结合使用时,可能会导致未定义的行为。备份属性由一个子系统读取和写入,而文件保护密钥由另一个子系统使用。在应用程序升级或还原期间,可以迁移或还原文件,而不保留文件保护值的属性。此外,将数据保护属性添加到文件将使用受保护的文件替换旧文件。这对您的应用程序是透明的,但可能具有升级或恢复的副作用,使未受保护的版本到位。这是建议您在应用程序写入文件时设置此属性的众多原因之一。
答案 1 :(得分:0)
我不相信有任何官方答案或文件适用。
有趣的是,在我的情况下,在iOS 9和8上升级时,Library/Application Support
下的文件已设置为NSFileProtectionComplete
。
这个 seeems 是由于Apple服务器上的App ID上的Data Protection设置为Complete,而似乎似乎已被Xcode自动更新它在证书续订后重新生成配置文件(尽管本地Xcode项目中的数据保护功能为Off)。
这实际上是有道理的。在为新版本启用数据保护权利后,iOS可以安全地运行并负责升级所有文件的数据保护。
什么是没有意义的是当别人(咳嗽Xcode ahem)决定为你添加该权利时。
要添加到发布清单的内容: