0

I'm asking the user to select an image or file in the "Folder" application in iPhone with DocumentPicker. How can I transfer this selected file or image to my own application?

I got this error: Error Domain=GSLibraryErrorDomain Code=3 "Generation not found" UserInfo={NSDescription=Generation not found

enter image description here

Sheet:

.sheet(isPresented: $isOpenDocumentPicker, onDismiss: {
            self.isOpenDocumentPicker = false
        }, content: {
            DocumentPicker(fileContent: $fileContent)
        })

DocumentPicker:

struct DocumentPicker: UIViewControllerRepresentable {
    
    @Binding var fileContent: String
    
    func makeCoordinator() -> DocumentPickerCoordinator {
        return DocumentPickerCoordinator(fileContent: $fileContent)
    }
    
    func makeUIViewController(context: UIViewControllerRepresentableContext<DocumentPicker>) -> UIDocumentPickerViewController {
        let controller: UIDocumentPickerViewController
        controller = UIDocumentPickerViewController(forOpeningContentTypes: [.text, .pdf, .folder, .jpeg, .png, .gif, .exe, .data], asCopy: true)
        return controller
    }
    
    func updateUIViewController(_ uiViewController: UIDocumentPickerViewController, context: UIViewControllerRepresentableContext<DocumentPicker>) {
        
    }
}

class DocumentPickerCoordinator: NSObject, UIDocumentPickerDelegate, UINavigationControllerDelegate {
    
    @Binding var fileContent: String
    
    init(fileContent: Binding<String>) {
        _fileContent = fileContent
    }
    
    
    
    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        let fileURL = urls[0]
        do {
            fileContent = try String(contentsOf: fileURL, encoding: .utf8)
        } catch let error {
            print("error: \(error)")
        }
    }
}
Ufuk Köşker
  • 1,288
  • 8
  • 29
  • Why do you meant by "to my own application"? Inside bundle? - no. Inside sandbox - just use FileManager with received URL to copy. – Asperi Jul 11 '22 at 10:40

1 Answers1

0

According to Apples documentation you have to call startAccessingSecurityScopedResource() before accessing a files content.

In your case I'd update the documentPicker() function as follows:

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
    let fileURL = urls[0]

    guard fileURL.startAccessingSecurityScopedResource() else {
        // Handle denied access
        return
    }
    defer { fileURL.stopAccessingSecurityScopedResource() }

    do {
        fileContent = try String(contentsOf: fileURL, encoding: .utf8)
    } catch let error {
        print("error: \(error)")
    }
}
Cameron
  • 542
  • 5
  • 13
  • thank you sir but.. I put breakpoint but its not working.. I got this error. "Error Domain=GSLibraryErrorDomain Code=3 "Generation not found" UserInfo={NSDescription=Generation not found" – Ufuk Köşker Jul 11 '22 at 13:21