你在设备上测试过上述“hacky”解决方案吗?它在模拟器上运行良好,但由于iOS 13中新的访问权限规则, 代码会抛出"XXXXXX"无法移动,因为您没有访问"YYYYYY"的权限。
我深入挖掘并尝试覆盖XCode生成的标准Document.swift
代码的标准init()
和FileWrapper
函数定义,将所需的文件名设置为FileWrapper
的preferredFilename
和filename
属性:
struct SomeDocument: FileDocument, Decodable, Encodable {
static var readableContentTypes: [UTType] { [.SomeDocument] }
var someData: SomeCodableDataType
init() {
self.someData = SomeCodableDataType()
print("Creating.\n")
}
init(configuration: ReadConfiguration) throws {
guard let data = configuration.file.regularFileContents else {
throw CocoaError(.fileReadCorruptFile)
}
let savedPreferredName = configuration.file.preferredFilename
let savedName = configuration.file.preferredFilename
let fileRep = try JSONDecoder().decode(Self.self, from: data)
self.someData = fileRep.someData
print("Loading.\n Filename: \(savedPreferredName ?? "none") or \(savedName ?? "none")\n")
}
func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
do {
let fileRep = try JSONEncoder().encode(self)
let fileWrapper = FileWrapper.init(regularFileWithContents: fileRep)
fileWrapper.preferredFilename = fileName()
fileWrapper.filename = fileName()
print("Writing.\n Filename \(fileWrapper.preferredFilename ?? "none") or \(fileWrapper.filename ?? "none").\n")
return fileWrapper
} catch {
throw CocoaError(.fileReadCorruptFile)
}
}
func fileName() -> String {
let timeFormatter = DateFormatter()
timeFormatter.dateFormat = "yyMMdd'-'HH:mm"
let timeStamp = timeFormatter.string(from: Date())
let extention = ".ext"
let newFileName = timeStamp + "-\(someData.someUniqueValue())" + extention
return newFileName
}
}
这是控制台的打印输出。我已经在方括号[]中添加了用户操作:
[CREATE DOC BY TAPPING +]
Creating.
[AUTOMATIC WRITE]
Writing.
Filename 210628-16:49-SomeUniqueValue.ext or 210628-16:49-SomeUniqueValue.ext.
[AUTOMATIC LOAD]
Loading.
Filename: none or none
FileURL: /Users/bora/Library/Developer/CoreSimulator/Devices/F126086A-A752-4A71-B589-1B37DFC02746/data/Containers/Data/Application/D81C9D76-7986-4C0D-BA2C-1FDF69703875/Documents/Untitled 2.ext
isEditable: true
[CLOSING DOC]
Writing.
Filename 210628-16:49-SomeUniqueValue.ext or 210628-16:49-SomeUniqueValue.ext.
[REOPENING DOC]
Loading.
Filename: none or none
FileURL: /Users/bora/Library/Developer/CoreSimulator/Devices/F126086A-A752-4A71-B589-1B37DFC02746/data/Containers/Data/Application/D81C9D76-7986-4C0D-BA2C-1FDF69703875/Documents/Untitled 2.ext
isEditable: true
在初始文档创建后,第一次写入(使用func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper
),文件名已正确分配给FileWrapper
。然而,当视图代码加载文档时,明显没有使用FileWrapper
的任何文件名属性。当文档关闭(使用分配名称的FileWrapper
进行写入)并再次打开时,情况相同。
这看起来像是一个错误。我不明白为什么DocumetGroup不使用FileWrapper
的文件名属性,而绝对使用由同一FileWrapper
提供的数据内容。
我还没有在新的SwiftUI(iOS14)上尝试过。我会尝试并回报。
更新:现在在iOS 14上测试了,也不起作用。我想是时候提交反馈了。