Проблема обмена файлами между OSX / iOS Версии приложения через общую папку iCloud - PullRequest
0 голосов
/ 18 марта 2020

У меня проблема с обменом файлами между версией моего приложения для OSX и версией приложения iOS при сохранении в общей папке iCloud.

Версия iMa c может читать любой файл из общая папка. Однако версия iOS не может прочитать файлы, сохраненные из версии OSX.

При вызове contentOfDirectory на iOS

FileManager.default.contentsOfDirectory(at: mmFile.containerUrl!, includingPropertiesForKeys: nil, options: [])

я получаю URL-адреса обратно как:

file: ///private/var/mobile/Library/Mobile%20Documents/iCloud~xxx/Documents/Untitled.render-z, file: /// private / var / mobile / Library / Mobile% 20Documents / iCloud ~ xxx / Documents / .refract.render-z.icloud

Где первый файл был сохранен в iOS и загружен правильно, второй из OSX имеет «.» префикс и постфикс ".icloud" и не могут быть загружены.

Я сохраняю файлы с тем же кодом:

stringData.write(to: url(), atomically: true, encoding: .utf8)

Кодировка не имеет значения, то же поведение при использовании .ascii или .utf8 et c.

Когда я пытаюсь прочитать такой файл в iOS, я получаю содержимое обратно, как

bplist00Ó\NSURLNameKey_NSURLFileSizeKey_NSURLFileResourceTypeKey_2spheres.render-z

Я не могу понять это! Кажется, все права и свойства plist верны, и совместное использование базы данных iCloud также работает нормально.

1 Ответ

0 голосов
/ 20 марта 2020

Я понял это. Для тех, у кого была такая же проблема:

Не используйте FileManager для анализа файла, а используйте NSMetadataItem как этот

    query = NSMetadataQuery()
    query.predicate = NSPredicate.init(format: "%K BEGINSWITH %@", argumentArray: [NSMetadataItemPathKey, self.containerUrl!.path])
    query.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]

    NotificationCenter.default.addObserver(self, selector: #selector(self.updateCloudData), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: nil)

    query.enableUpdates()
    query.start()

и, что наиболее важно, используйте FileController для чтения файла, это гарантирует синхронизация с iCloud:

func loadJSON(url: URL) -> String
{
    var string : String = ""

    let fc = NSFileCoordinator()
    fc.coordinate(readingItemAt: url, options: .forUploading, error: nil, byAccessor: { url in
        do {
            string = try String(contentsOf: url, encoding: .utf8)
        } catch {
            print(error.localizedDescription)
        }
    })
    return string
}
...