Usar SwiftUI .fileImporter
para obter um URL 'selecionado pelo usuário' para um diretório, ao usar FileManager
's URL enumerator
, nextObject()
retorna nulo.
Direito:
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
(Tentei ler e escrever, mesmo resultado)
Da visualização SwiftUI
.fileImporter(
isPresented: $showingOpenPanel,
allowedContentTypes: [.fileURL, .directory],
onCompletion: { result in
viewModel.onImport(result: result)
}
)
Obtendo URL válido ( targetURL
), mas não é possível obter nenhum arquivo do enumerador:
// 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
A remoção do direito ao Sandbox resolve o problema (portanto, está relacionado ao Sandbox). Mas isso não user-selected
significa que o usuário escolha o OpenPanel usando fileImporter
?
De acordo com a documentação ,
fileImporter
fornece URLs com escopo de segurança, portanto você precisará ligarstartAccessingSecurityScopedResource
estopAccessingSecurityScopedResource
acessá-los.por exemplo
Você também deve criar um marcador para o URL se precisar acessá-lo posteriormente. Veja
bookmarkData
einit(resolvingBookmarkData:)
.Para obter mais informações, consulte as seções sobre escopos de segurança na
NSURL
página de documentação.