Не удается записать на iCloud Drive - PullRequest
0 голосов
/ 12 апреля 2020

Мне тяжело с iCloud Drive в моем приложении. Я не могу создать папку своего приложения в iCloud Drive.

Почему-то вчера мне удалось создать папку и сохранить в ней элементы, но сегодня, после запуска кода, папка исчезла, и я больше не могу сохранять файлы .

Вот пример кода, который мне удалось запустить и запустить вчера:

let str = "ivan cantarino"

guard let iCloudPath = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") else {
    print("Failed to get iCloud path")
    return
}

print("icloud path:", iCloudPath.absoluteString)
// prints: icloud path: file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~ivancantarino~Cozynote/Documents

let lastPath = iCloudPath.appendingPathComponent("iCloudDrive.txt")

// writes a file to the directory
do {
    try str.write(to: lastPath, atomically: true, encoding: .utf8)
    print("success")
} catch {
    print("failed to write with error:", error.localizedDescription)
    // prints: failed to write with error: The file “iCloudDrive.txt” couldn’t be saved in the folder “Documents”.
}

Вот мой info.plist Информация о iCloud:

<key>NSUbiquitousContainers</key>
<dict>
    <key>iCloud.com.ivancantarino.Cozynote</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerName</key>
        <string>Cozynote</string>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
    </dict>
</dict>

Вот печать, показывающая, что я использую соответствующий контейнер:

image

Я поднял версию и номер сборки приложения, переустановил приложение, но каким-то образом Я не могу написать путь. Он продолжает печатать ошибку.

Кто-нибудь может заметить, что я здесь не так делаю?

1 Ответ

0 голосов
/ 12 апреля 2020

Я работал над приложением, которое сильно зависит от диска iCloud. В итоге это худшее. трудно отладить непредсказуемо и плохо документировано.

Так что я могу дать вам несколько вариантов, чтобы попробовать и посмотреть, поможет ли это. Одна из вещей, которая может вам очень помочь, - это создание UIDocument подкласса, они могут очень хорошо взаимодействовать с iCloud Drive.

 class TextDoc:UIDocument{
    var data:String?


    override func contents(forType typeName: String) throws -> Any {
        return data?.data(using: .utf8) ?? Data()
    }

    override func load(fromContents contents: Any, ofType typeName: String?) throws {
        if let userContent = contents as? Data {
            data = String(data: userContent, encoding: .utf8)
        }
    }

}


let folder = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Folder")

try? FileManager.default.createDirectory(atPath: folder?.path ?? "", withIntermediateDirectories: true, attributes: nil)

let fileURL = folder?.appendingPathComponent("iCloudDrive.txt")

let uiDoc = TextDoc(fileURL: fileURL!)
uidoc.save(to: url, for: .forOverwriting) { (success) in
    print("save was \(success)")
}

Если сохранение прошло успешно, вы можете открыть его, используя open(completionHandler: <#T##((Bool) -> Void)?##((Bool) -> Void)?##(Bool) -> Void#>)

Также убедитесь, что вы правильно настроили iCloud на developer.apple.com enter image description here

...