iCloud Drive版本冲突:NSFileVersion修改日期异常导致无法判定最新版本
iCloud Drive版本冲突问题咨询
冲突触发场景
- 使用同一Apple账号绑定的两台设备(iPhone XR和iPad),按以下步骤触发文件冲突:
- 在在线设备(iPhone XR)上创建文本文件;
- 在离线设备(iPad)上编辑该文件;
- 再次在在线设备(iPhone XR)上更新文件内容;
- 将离线设备(iPad)切换回在线状态。
预期与实际问题
预期能获取iPhone XR上最后更新的文件内容,但读取时出现版本冲突。尝试遵循Apple官方文档建议,通过NSFileVersion对比修改日期解决冲突,却发现NSFileVersion.unresolvedConflictVersionsOfItem与NSFileVersion.currentVersionOfItem的modificationDate完全相同,无法准确判定最新版本。
使用的代码片段
private func pickLatestVersion(for documentURL: URL) -> Bool { guard let versionsInConflict = NSFileVersion.unresolvedConflictVersionsOfItem(at: documentURL), let currentVersion = NSFileVersion.currentVersionOfItem(at: documentURL) else { return false } let currentVersionURLDate: Date? = currentVersion.url.getAttribute(fileAttribute: .modificationDate) print("Current Version: ", currentVersion.modificationDate?.formatted(date: .abbreviated, time: .complete)) print("Current Version URL DATE: ", currentVersionURLDate?.formatted(date: .abbreviated, time: .complete)) let currentString = try? String(contentsOf: currentVersion.url, encoding: .utf8) print("Current String: ", currentString) var shouldRevert = false var winner = currentVersion for version in versionsInConflict { let versionURLDate: Date? = version.url.getAttribute(fileAttribute: .modificationDate) print("Conflict Version: ", version.modificationDate?.formatted(date: .abbreviated, time: .complete)) print("Conflict Version URL DATE: ", versionURLDate?.formatted(date: .abbreviated, time: .complete)) let conflictString = try? String(contentsOf: version.url, encoding: .utf8) print("Conflict String: ", conflictString) if let date1 = version.modificationDate, let date2 = currentVersion.modificationDate, date1 > date2 { winner = version } } if winner != currentVersion { do { try winner.replaceItem(at: documentURL) shouldRevert = true } catch { print("Failed to replace version: \(error)") } } do { try NSFileVersion.removeOtherVersionsOfItem(at: documentURL) versionsInConflict.forEach({$0.isResolved = true}) } catch { print("Failed to remove other versions: \(error)") } return shouldRevert }
冲突日志
Conflicts exist for the document file located at the file URL. Current Version: Optional("Apr 15, 2024 at 5:18:21 PM GMT+3") Current Version URL DATE: Optional("Apr 15, 2024 at 5:18:21 PM GMT+3") Current String: Optional("Xr") Conflict Version: Optional("Apr 15, 2024 at 5:18:21 PM GMT+3") Conflict Version URL DATE: Optional("Apr 15, 2024 at 5:18:35 PM GMT+3") Conflict String: Optional(“iPad one)
此外,还存在疑问:为何从冲突文件URL获取的modificationDate属性值与NSFileVersion.modificationDate返回值不一致?希望得到该问题的见解或解决方案,可通过完整Xcode项目复现问题。
内容的提问来源于stack exchange,提问作者KAMIKAZE
相关产品推荐
相关产品推荐

