Доступ к документам 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 ответа
Создать контейнер iCloud для iCloud
а. войдите на developer.apple.com
б. перейдите в Идентификаторы и добавьте Контейнеры iCloud.
c. Вы не можете удалить созданные контейнеры iCloud.
Создайте идентификатор приложения, включающий возможности iCloud
а. Создать идентификатор приложения
б. Добавьте поддержку iCloud с явным идентификатором пакета.
c. Создайте профиль обеспечения и загрузите его в Xcode.
Настройте возможности в 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>
Фрагмент тестового кода
а. Попробуйте нижеприведенный быстрый и грязный тест.
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")
}
Запись в папку документов приложения отличается от хранения документов 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.
}
}
}
}
}