Быстрая запись / сохранение / перемещение файла документа на диск iCloud

Уже более двух дней пытаюсь записать файл на iCloud drive. Я попытался написать простой текстовый файл напрямую, локально, а затем переместить его, используя UIDocumentMenuViewController и т. Д. Я не получаю никаких ошибок с моим кодом и прохожу через отладчик, он выглядит успешным, но когда я проверяю, существует ли файл или по крайней мере каталог iCloud, там ничего нет. Я попробовал и симулятор, и свой iPhone, запустил синхронизацию iCloud и все остальное, что я мог придумать.

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

Я настроил свой файл plist и свои права:

<key>NSUbiquitousContainers</key>
<dict>
    <key>iCloud.com.paul.c.$(PRODUCT_NAME:rfc1034identifier)</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerName</key>
        <string>myCloudTest</string>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
    </dict>
</dict>

Я также увеличил версию пакета, как указано на: Сохраните документы iOS 8 в iCloud Драйв

Я безуспешно перепробовал десятки руководств. Мой последний код основан на этом примере: https://medium.com/ios-os-x-development/icloud-drive-documents-1a46b5706fe1.

Вот мой код:

@IBAction func ExportFile(sender: AnyObject) {

    var error:NSError?

    let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil)?.URLByAppendingPathComponent("myCloudTest")

    //is iCloud working?
    if  iCloudDocumentsURL != nil {

        //Create the Directory if it doesn't exist
        if (!NSFileManager.defaultManager().fileExistsAtPath(iCloudDocumentsURL!.path!, isDirectory: nil)) {
                //This gets skipped after initial run saying directory exists, but still don't see it on iCloud
                NSFileManager.defaultManager().createDirectoryAtURL(iCloudDocumentsURL!, withIntermediateDirectories: true, attributes: nil, error: nil)
        }
    } else {
        println("iCloud is NOT working!")
        //  return
    }

    if ((error) != nil) {
        println("Error creating iCloud DIR")
    }


    //Set up directorys
    let localDocumentsURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: .UserDomainMask).last as! NSURL

    //Add txt file to my local folder
    let myTextString = NSString(string: "HELLO WORLD")
    let myLocalFile = localDocumentsURL.URLByAppendingPathComponent("myTextFile.txt")
    let written = myTextString.writeToURL(myLocalFile, atomically: true, encoding: NSUTF8StringEncoding, error: &error)

    if ((error) != nil){
        println("Error saving to local DIR")
    }


   //If file exists on iCloud remove it
    var isDir:ObjCBool = false
    if (NSFileManager.defaultManager().fileExistsAtPath(iCloudDocumentsURL!.path!, isDirectory: &isDir)) {
        NSFileManager.defaultManager().removeItemAtURL(iCloudDocumentsURL!, error: &error)
    }

    //copy from my local to iCloud
    if (error == nil && !NSFileManager.defaultManager().copyItemAtURL(localDocumentsURL, toURL: iCloudDocumentsURL!, error: &error)) {
        println(error?.localizedDescription);
    }

Спасибо, что нашли время для этого.

Привет, Пол

Я запустил код на моем iphone после кода выше:

var error:NSError?
    let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil) //?.URLByAppendingPathComponent("myCloudTest")

    var fileManager: NSFileManager = NSFileManager()


    var fileList: NSArray = fileManager.contentsOfDirectoryAtURL(iCloudDocumentsURL!, includingPropertiesForKeys: nil, options: nil, error: &error)!
    var filesStr: NSMutableString = NSMutableString(string: "Files in iCloud folder \n")
    for s in fileList {

        println(s)
    }

и выводит путь к моему текстовому файлу: file: ///private/var/mobile/Library/Mobile%20Documents/iCloud~com~paul~c~myApp/MyTextFile.txt

Мой файл там, я его просто не вижу на iCloud drive.


person Paul C    schedule 30.08.2015    source источник
comment
Вы заставили это работать? У меня такая же проблема, и я попробовал все предложения здесь, но безуспешно. Сообщите нам, если вы решили проблему, ответив на свой вопрос здесь   -  person RawMean    schedule 18.01.2017
comment
Хотите знать, есть ли у вас возможность перенести этот код на Swift 3? Спасибо!   -  person Kaiusee    schedule 23.01.2017


Ответы (4)


У меня была такая проблема. Я последовал совету здесь и обнаружил, что мой Info.plist ключ неверен. Как только я изменил его на iCloud.MY_BUNDLE_IDENTIFIER (т.е. скопировал строку из ключа CFBundleIdentifier выше в Info.plist), все заработало.

Удаление .com из вашего ключа может решить вашу проблему.

person Rick Andrews    schedule 05.09.2015

FWIW:

Я также обнаружил, что имя проекта в идентификаторе пакета важно.

Мой идентификатор пакета проекта был примерно таким: aaa-bbb-ccc-ddd

Я не мог заставить работать iCloud.

Затем я переименовал его в: aaa-bbb.ccc-ddd

Это начало работать.

person Mehmet    schedule 19.02.2016

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

  1. Выйдите из iCloud на вашем Mac
  2. Выйдите из iCloud на симуляторе
  3. Снова войдите в iCloud на своем Mac
  4. Снова войдите в iCloud на симуляторе.
  5. Сделайте чистую сборку из XCode (Shift-Cmd-K)

Похоже, что это сбрасывает синхронизацию структур папок, когда ваше приложение записывает в каталог документов iCloud - без необходимости касаться номера пакета. На это уходит немного больше времени, но я немного страдаю ОКР и предпочитаю, чтобы мой первоначальный запуск приложения начинался с 1!

person pscarnegie    schedule 20.03.2019

Может быть, есть правило для названия контейнера.
Я пробовал следующие названия.

○: iSheet
×: sheetFiles
×: com.myname.sheetFiles

person simpleDrinker    schedule 13.10.2020