您是否在设备上测试过上述“hacky”解决方案?它在模拟器上运行良好,但由于iOS 13 中的新访问权限规则,代码抛出“XXXXXX” couldn’t be moved because you don’t have permission to access “YYYYYY”.
我已经深入挖掘并尝试覆盖 XCode 生成的标准代码的标准init()
和FileWrapper
函数定义Document.swift
,以将所需的文件名preferredFilename
和filename
属性设置为FileWrapper
:
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 上测试,在那里也不起作用。我想是时候雷达了。