排查iCloud备份异常:图标存NSCaches仍被备份,还有哪些检查项?
除了检查目录的NSURLIsExcludedFromBackupKey,你还可以从这些方向排查:
逐文件验证排除标记:
你当前只检查了目录的属性,但个别文件可能被单独设置了允许备份(比如代码里误操作给某个文件加了备份标记)。遍历目录下的所有文件,逐个调用getResourceValue:forKey:error:检查NSURLIsExcludedFromBackupKey,确保每个文件的标记都正确。确认文件实际路径:
打印文件的完整URL,确认它们确实在NSCachesDirectory下——有时候代码逻辑错误会把文件移到Documents或Library/Application Support这类默认会被备份的目录,别光看逻辑,看实际路径。检查权限与设置错误:
设置NSURLIsExcludedFromBackupKey需要文件有写入权限,如果权限不足,设置操作会失败。在设置这个属性时,一定要捕获并查看error信息,确认设置是否成功。兼容早期iOS版本的旧机制:
你记得的早期iOS逐文件设置机制,是iOS 5.1之前用的Core Foundation API。当时NSURLIsExcludedFromBackupKey还没引入,需要用kCFURLIsExcludedFromBackupKey来设置和检查:// 设置文件排除备份(iOS 5.0及更早) CFURLRef cfURL = (__bridge CFURLRef)fileURL; CFErrorRef error = NULL; BOOL success = CFURLSetResourcePropertyForKey(cfURL, kCFURLIsExcludedFromBackupKey, kCFBooleanTrue, &error); if (!success && error) { // 处理设置失败的情况 } // 检查文件是否排除备份(iOS 5.0及更早) Boolean isExcluded = false; if (CFURLGetResourcePropertyForKey(cfURL, kCFURLIsExcludedFromBackupKey, &isExcluded, &error)) { // 根据isExcluded判断状态 }如果你的App需要兼容iOS 5.x及更早版本,要确保同时处理新旧两种API。
验证实际备份内容:
用Xcode的「Devices and Simulators」工具,选中你的设备和App,点击「Download Container」导出App容器,然后查看备份相关的文件,确认这些图标文件是否真的被包含在备份里——有时候可能是你误判了备份内容。
内容的提问来源于stack exchange,提问作者Anton Tropashko

