Доступ к документам iCloud в iOS

Я пытаюсь получить доступ к документам, которые я положил в папку "iCloud Documents" на моем Mac в приложении для iOS, но не могу понять, как это сделать.

let manager = FileManager.default  
let dir = manager.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
let files = try? FileManager.default.contentsOfDirectory(at: dir!, includingPropertiesForKeys: nil, options: [])
print(files) //(Optional([])

Я включил iCloud Documents в своих приложениях и знаю, что в папке "Мои документы" на рабочем столе есть файлы.

Я явно что-то здесь упускаю..

заранее спасибо

2 ответа

  1. Создать контейнер iCloud для iCloud

    а. войдите на developer.apple.com

    б. перейдите в Идентификаторы и добавьте Контейнеры iCloud.

    c. Вы не можете удалить созданные контейнеры iCloud.

  2. Создайте идентификатор приложения, включающий возможности iCloud

    а. Создать идентификатор приложения

    б. Добавьте поддержку iCloud с явным идентификатором пакета.

    c. Создайте профиль обеспечения и загрузите его в Xcode.

  3. Настройте возможности в Xcode

    а. Нажмите и добавьте поддержку iCloud из «+ Возможности»

    б. Для хранения документов iCloud выберите «Документы iCloud» и выберите созданный вами контейнер.

    c. Добавьте ключ NSUbiquitousContainers в Info.plist

    d. «MyApp» внутри - это то, что будет отображаться как имя папки.

       <key>NSUbiquitousContainers</key>
    <dict>
        <key>iCloud.com.example.MyApp</key>
        <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>Any</string>
            <key>NSUbiquitousContainerName</key>
            <string>MyApp</string>
        </dict>
    </dict>
  1. Фрагмент тестового кода

    а. Попробуйте нижеприведенный быстрый и грязный тест.

          let driveURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
    if let unwrappedFU = driveURL {
        print("iCloud available")
        let fileURL = driveURL!.appendingPathComponent("test.txt")
        try? "Hello word".data(using: .utf8)?.write(to: fileURL)
    } else {
        print("iCloud not available")
    }
  1. Запись в папку документов приложения отличается от хранения документов iCloud. Вы можете сделать свою папку документов приложения видимой. Добавив в Info.plist 2 дополнительных свойства.

    а. Добавить документы для открытия поддержки: ДА

    б. Поддерживает открытие документов на месте: ДА

    c. Протестируйте с помощью фрагмента кода Тима. https://www.youtube.com/watch?v=p1UNnsodJxc

      
    let file = "\(UUID().uuidString).txt"
    let contents = "Some text..."
    
    let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let fileURL = dir.appendingPathComponent(file)
    
    do {
        try contents.write(to: fileURL, atomically: false, encoding: .utf8)
    }
    catch {
        print("Error: \(error)")
    }

ПРИМЕЧАНИЕ. Вы увидите папку приложения в приложении «Файлы» в папке «На моем iPhone». Это папка документов приложения, которую вы открыли пользователю. Вы также заметите папку своего приложения в папке iCloud Drive. Эти 2 папки разные. Вы должны использовать свою папку приложения и использовать папку iCloud Drive в качестве места назначения для экспорта, чтобы вам не пришлось много заниматься контролем доступа.

CAVEAT: Как ни странно, ничего из этого не сработало, включая уход в iCloud на iPhone. Хотя работал на симуляторе. Он заработал только после перезагрузки айфона в моем случае.

 func clickFunction(){

            let DOCUMENTS_DIRECTORY = "Documents"
            if let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent(DOCUMENTS_DIRECTORY){
                if let pathComponent = iCloudDocumentsURL.path as? String {
                    if (FileManager.default.fileExists(atPath: pathComponent, isDirectory: nil)) {

                        //Write it out the code of getting files
                        let fileManager = FileManager.default
                        let enumerator = fileManager.enumerator(atPath: DocumentsDirectory.iCloudDocumentsURL!.path!)
                        while let file = enumerator?.nextObject() as? String {
                            //this this the file or document path.
                        }
                    }
                }
            }
        }
Другие вопросы по тегам