Выбор папки из iCloud с помощью средства выбора документов - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь импортировать папку из iCloud с помощью Document Picker, чтобы загрузить ее на сервер, используя Alamofire.Я могу импортировать один файл, например .txt .pdf, из iCloud, но не могу выбрать папку, в которой есть несколько файлов.При попытке выбрать папку появляется следующая ошибка:

Невозможно загрузить данные: Ошибка Domain = NSCocoaErrorDomain Code = 257 "Файл« xxxx »не может быть открыт, потому что вы неу меня нет разрешения на его просмотр. "... {Error Domain = NSPOSIXErrorDomain Code = 13 "Разрешение отклонено"}}

А вот мой код:

someFunctionToGetPickedFilePath = { (filePath) in
        let urlString = filePath.path
        let fileWithPath: URL = URL.init(fileURLWithPath: urlString)

        do {
            let fileData = try Data(contentsOf: fileWithPath)
            // upload the fileData to server with Alamofire upload request
        } catch {
            print("Unable to load data: \(error)")
        }
    }

" filePath "URL-адрес здесь исходит из функции выбора документа, например:

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
    // some code 
}

Я пытаюсь найти решение в течение почти 2 дней, но, похоже, не могу найти решение.Как выбрать папку из iCloud и почему я получаю сообщение об ошибке «Отказано в доступе»?Любой ответ будет высоко оценен.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы получаете эту ошибку, потому что вы получаете путь к папке, в которой существуют ваши файлы, и как @ ivan-ičin сказал в комментариях, вы не можете выбрать всю папку из iCloud в соответствии с документацией.

Так что, если вы пытаетесь загрузить все файлы определенной папки на свой сервер, я бы предложил вам получить URL-адрес папки, а затем, используя приведенный ниже код, вы можете получить список всех файлов, представленных в этом файле.папка.

Вот как вы можете получить список всех файлов в папке с документами, которые вы пытаетесь выбрать.

let fileManager = FileManager.default
let documentsURL = "YOUR FOLDER URL"
//If all files are in your app document directory then use this line
//fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]

do {
    let fileURLs = try fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil)
    // Append files to an array here and then iterate the array later and upload files to server one by one.
} catch {
    print("Error while enumerating files \(documentsURL.path): \(error.localizedDescription)")
} 

Получив URL-адреса, вы можете добавить ихв массив и загружать их по одному на ваш сервер с помощью Alamofire.

0 голосов
/ 29 ноября 2018

Помните, что когда дело доходит до iCloud, вы находитесь в Песочнице, поэтому вам необходимо использовать FileManager для получения соответствующих файлов.

например,

  1. Убедитесь, что "iCloud Documents "отмечен в проекте
  2. Укажите контейнер, например, контейнер, который вы указали на developer.apple.com.Xcode сделает это за вас автоматически и будет выглядеть примерно так: iCloud.com.yourapp.identifier.whatever.abb
  3. Убедитесь, что iCloud включен для вашего приложения, и опять же, Xcode сделает это за вас, если вы настроили свой идентификатор разработчикав нем правильно (Xcode -> Peferences -> Accounts (tab) ... Добавьте его туда ..

Теперь с некоторой магией кода вы можете получить это .. Хотя это немного сложнее, это правильный путь (слишком правильный ИМХО):

https://theswiftdev.com/2018/05/17/how-to-use-icloud-drive-documents/

Но вам нужно положиться на FileManager (старый NSFileManager)

...