使用 SwiftUI 的
.fileImporter
获取目录的“用户选择”URL,当使用 FileManager
的 URL enumerator
时,nextObject()
返回 nil。
权利:
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
(尝试读写,结果相同)
从 SwiftUI 视图
.fileImporter(
isPresented: $showingOpenPanel,
allowedContentTypes: [.fileURL, .directory],
onCompletion: { result in
viewModel.onImport(result: result)
}
)
获取有效的 URL (
targetURL
),但无法从枚举器获取任何文件:
// In ViewModel
switch result {
case .success(let url):
targetURL = url // URL is valid ("/Users/<username>/Desktop/MyFolder/")
...
let enumerator = FileManager.default.enumerator(at: targetURL, includingPropertiesForKeys: nil) // enumerator is not nil
enumerator?.nextObject() // nil
删除沙盒权利可以解决该问题(因此它与沙盒相关)。但不是
user-selected
意味着用户使用 fileImporter
从 OpenPanel 中选择?
根据文档,
fileImporter
为您提供安全范围的URL,因此您需要调用startAccessingSecurityScopedResource
和stopAccessingSecurityScopedResource
来访问它们。
例如
if targetURL.startAccessingSecurityScopedResource() {
defer { targetURL.stopAccessingSecurityScopedResource() }
let enumerator = FileManager.default.enumerator(at: targetURL, includingPropertiesForKeys: nil)
// do things with the enumerator...
print(enumerator?.nextObject())
} else {
// fail to access the URL, handle this appropriately
}
如果您以后需要访问该 URL,还应该为该 URL 创建书签。请参阅
bookmarkData
和 init(resolvingBookmarkData:)
。