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, а не когда переустанавливаю приложение?