Kal*_*Kal 8 ios nsfilecoordinator swift uidocumentpickerviewcontroller ios13
我有一个 iOS 应用程序,它试图从外部存储设备读取文件而不将它们导入应用程序的沙箱。
我已按照此处概述的 Apple 文档来执行此操作-
我能够检索选定的目录(位于通过 Lightning 端口连接的外部存储设备上)并枚举目录中的文件。
但是,当我尝试按照推荐的模式对这些文件执行某些操作时,我遇到了失败,并且基本上会出现该文件的权限错误。
let shouldStopAccessing = pickedFolderURL.startAccessingSecurityScopedResource()
defer {
if shouldStopAccessing {
pickedFolderURL.stopAccessingSecurityScopedResource()
}
}
var coordinatedError:NSError?
NSFileCoordinator().coordinate(readingItemAt: pickedFolderURL, error: &coordinatedError) { (folderURL) in
let keys : [URLResourceKey] = [.isDirectoryKey]
let fileList = FileManager.default.enumerator(at: pickedFolderURL, includingPropertiesForKeys: keys)!
for case let file as URL in fileList {
if !file.hasDirectoryPath {
do {
// Start accessing a security-scoped resource.
guard file.startAccessingSecurityScopedResource() else {
// Handle the failure here.
//THIS ALWAYS FAILS!!
return
}
// Make sure you release the security-scoped resource when you are done.
defer { file.stopAccessingSecurityScopedResource() }
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,如果文件通过模拟器在 iCloud Drive 上,这很好用。它在外部设备和真实设备上的 iCloud Drive 上都失败了。
这是一个完整的工作项目,演示了失败。
因此,这似乎是上面发布的链接的文档问题。当用户选择一个文件夹时,所有文件和文件夹都会被递归授予访问权限并自动设置安全范围。该行guard file.startAccessingSecurityScopedResource()始终返回 false。
获得这项工作的技巧不是尝试对单个文件进行安全范围,而是确保在您访问文件之前此代码片段不会运行。
defer {
if shouldStopAccessing {
pickedFolderURL.stopAccessingSecurityScopedResource()
}
}
Run Code Online (Sandbox Code Playgroud)
只要您pickedFolderURL在安全范围内继续访问文件,您就会成功。
希望这可以帮助某人。
| 归档时间: |
|
| 查看次数: |
2779 次 |
| 最近记录: |