沙盒中“用户选择”的 FileManager 枚举器的 nextObject nil

问题描述 投票:0回答:1

使用 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 中选择?

swift macos swiftui
1个回答
0
投票

根据文档

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:)

© www.soinside.com 2019 - 2024. All rights reserved.