Проблема: по какой-то причине на основе приведенной ниже реализации я могу создать файл только один раз в этой папке, и любое последующее создание файла приводит к «Не удалось получить доступ к ресурсу области безопасности». Чтобы обойти эту проблему, мне нужно снова выбрать папку, а затем отправить ее. Это не тот опыт, с которым должен столкнуться пользователь. Пользователь должен выбрать путь к папке только один раз, и он будет сохранен в приложении iOS. Пользователь должен больше заботиться о создании файлов в этой папке.
Ниже приведен код
Код: Выделить всё
class FolderManager: NSObject, UIDocumentPickerDelegate {
// Singleton instance for shared access
static let shared = FolderManager()
private override init() {}
// Function to present the document picker for selecting a folder
func selectFolder(from viewController: UIViewController) {
let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.folder], asCopy: false)
documentPicker.delegate = self
documentPicker.allowsMultipleSelection = false
viewController.present(documentPicker, animated: true, completion: nil)
}
// Delegate method called when a folder is selected
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let selectedFolderURL = urls.first else { return }
saveFolderURL(selectedFolderURL)
}
// Function to save the folder URL as bookmark data
func saveFolderURL(_ url: URL) {
do {
let bookmarkData = try url.bookmarkData(options: .minimalBookmark, includingResourceValuesForKeys: nil, relativeTo: nil)
UserDefaults.standard.set(bookmarkData, forKey: "selectedFolderURL")
} catch {
print("Error saving folder URL: \(error)")
}
}
func retrieveFolderURL() -> URL? {
guard let bookmarkData = UserDefaults.standard.data(forKey: "selectedFolderURL") else { return nil }
var isStale = false
let folderURL = try? URL(resolvingBookmarkData: bookmarkData, options: [], bookmarkDataIsStale: &isStale)
if isStale {
print("Bookmark data is stale")
// Handle stale bookmark data
do {
let newBookmarkData = try folderURL?.bookmarkData(options: .minimalBookmark, includingResourceValuesForKeys: nil, relativeTo: nil)
UserDefaults.standard.set(newBookmarkData, forKey: "selectedFolderURL")
} catch {
print("Error updating stale bookmark data: \(error)")
}
}
return folderURL
}
// Function to create and save a file in the selected folder
func createFileInFolder(fileName: String, fileContents: String) {
guard let folderURL = retrieveFolderURL() else {
print("Failed to retrieve folder URL")
return
}
if !folderURL.startAccessingSecurityScopedResource() {
print("Failed to access security scoped resource")
return
}
defer {
folderURL.stopAccessingSecurityScopedResource()
print("stoppedAccessingSecurityScopedResource")
}
let fileURL = folderURL.appendingPathComponent(fileName)
do {
try fileContents.write(to: fileURL, atomically: true, encoding: .utf8)
print("File created successfully at \(fileURL.path)")
} catch {
print("Error creating file: \(error)")
}
}
}
Любая помощь приветствуется.
п>
Подробнее здесь: https://stackoverflow.com/questions/787 ... e-resource