Swift - файл приложения не отображается в iCloud Drive после синхронизации

Невозможно передать файлы между приложением и iCloud

У меня есть небольшое приложение для викторины, и мне нужно сохранить результаты в iCloud, чтобы восстановить их, если пользователь переустанавливает приложение.

Поэтому я использовал следующую логику для синхронизации данных:

Когда пользователь запускает приложение, проверьте, есть ли какие-либо файлы в DocumentsDirectory.

Случай 1 - Не первый запуск:

  • Файл найден
  • Разбор файла

Случай 2 - Первый запуск на устройстве:

  • Файл не найден
  • Попробуйте скачать файл из iCloud
  • Файл найден
  • Скачать ОК
  • Разбор файла

Случай 3 - Первое использование:

  • Файл не найден
  • Попробуйте скачать файл из iCloud
  • Файл не найден
  • игнорировать

if(!checkIfUserDataExists())
{
    print("File does not exist")
    cloudDataManager.copyFileToLocal()
}

if(checkIfUserDataExists())
{
    print("File exists")
    parseUserDataJSON.readUserDataJSONFromFile()
}

Затем пользователь начинает использовать приложение и принимает тест. При сохранении:

  • Экспорт / сохранение файла JSON (UserData.json)
  • Сохранить в iCloud (если iCloud включен)

DataSingleton.sharedInstance.saveCurrentUserSession(userSession: newUserSession!)

self.exportUserDataJSON.createUserDataJSON()

if(self.cloudDataManager.isCloudEnabled())
{
    self.cloudDataManager.copyFileToCloud()
}

Локальная часть работает просто отлично, но синхронизация немного сложная.

Когда я пытаюсь сохранить файл в iCloud, он, кажется, работает, и если я проверяю свое устройство в Настройках> Apple ID > iCloud > Управление хранилищем, я вижу файл UserData.json. Более того, с каждой новой сдачей теста размер увеличивается.

Поэтому, чтобы проверить это, я включил общий доступ к iTunes и удалил файл данных, а затем запустил приложение. Похоже, что это работает с отступом в случае 2.

Однако, если я удаляю приложение и пытаюсь повторить попытку, это происходит в случае 3, но файл, найденный в iCloud, называется не UserData.json, а.UserData.json.icloud. Кажется, он загружает файл, и я не получаю никакой ошибки, но файл не виден в iTunes, через iTunes Sharing, а также не дает результатов.

import UIKit

class CloudDataManager
{
    static let documentsDirectoryURL : NSURL? = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: .userDomainMask).last! as NSURL
    static let iCloudDocumentsURL : NSURL? = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") as NSURL?


    /*
    // MARK: - Check if iCloud sync is enabled
    */

    func isCloudEnabled() -> Bool
    {
        print("CloudDataManager > isCloudEnabled")

        if CloudDataManager.iCloudDocumentsURL != nil
        {
            print("iCloud sync is enabled")

            return true
        }
        else
        {
            print("iCloud sync is disabled")

            return false
        }
    }


    /*
    // MARK: - Delete all files in a Directory
    */

    func deleteFilesInDirectory(url: NSURL?)
    {
        print("CloudDataManager > deleteFilesInDirectory")

        let fileManager = FileManager.default
        let enumerator = fileManager.enumerator(atPath: url!.path!)
        while let file = enumerator?.nextObject() as? String
        {
            do
            {
                try fileManager.removeItem(at: url!.appendingPathComponent(file)!)
                print("Files deleted")
            }
            catch let error as NSError
            {
                print("Failed to delete files : \(error)")
            }
        }
    }


    /*
    // MARK: - Copy all files in DocumentsDirectory to iCloud
    */

    func copyFileToCloud()
    {
        print("CloudDataManager > copyFileToCloud")

        if isCloudEnabled()
        {
            deleteFilesInDirectory(url: CloudDataManager.iCloudDocumentsURL!)

            let fileManager = FileManager.default
            let enumerator = fileManager.enumerator(atPath: CloudDataManager.documentsDirectoryURL!.path!)
            while let file = enumerator?.nextObject() as? String
            {
                do
                {
                    try fileManager.copyItem(at: CloudDataManager.documentsDirectoryURL!.appendingPathComponent(file)!,
                                             to: CloudDataManager.iCloudDocumentsURL!.appendingPathComponent(file)!)

                    print("Copied to iCloud")
                }
                catch let error as NSError
                {
                    print("Failed to copy file to Cloud : \(error)")
                }
            }
        }
        else
        {
            print("iCloud sync disabled")
        }
    }


    /*
    // MARK: - Copy all files in iCloud to DocumentsDirectory
    */

    func copyFileToLocal()
    {
        print("CloudDataManager > copyFileToLocal")

        if isCloudEnabled()
        {
            deleteFilesInDirectory(url: CloudDataManager.documentsDirectoryURL!)

            let fileManager = FileManager.default
            let enumerator = fileManager.enumerator(atPath: CloudDataManager.iCloudDocumentsURL!.path!)
            while let file = enumerator?.nextObject() as? String
            {
                do
                {                       
                    try fileManager.copyItem(at: CloudDataManager.iCloudDocumentsURL!.appendingPathComponent(file)!,
                                             to: CloudDataManager.documentsDirectoryURL!.appendingPathComponent(file)!)

                    print("Copied to local dir")
                }
                catch let error as NSError
                {
                    print("Failed to copy file to local dir : \(error)")
                }
            }
        }
        else
        {
            print("iCloud sync disabled")
        }
    }
}

Есть идеи, что я делаю не так? Кроме того, почему это работает, когда я удаляю только файл JSON из DocumentsDirectory, а не когда переустанавливаю приложение?

0 ответов

Другие вопросы по тегам