swift iCloud: не удается заставить setUbiquitous работать

Мое приложение создает определенные файлы изображений, которые я хочу скопировать в учетную запись пользователя iCloud Drive.

Насколько я понимаю, простой вызов setUbiquitous() должен инициировать iCloud для синхронизации файлов между устройствами, чтобы пользователь мог получить файлы, открытые в его средстве поиска Mac.

Мой код выглядит следующим образом:

  class func write(image data: Data, to path: String) -> URL? {
        var path = "\(path).\(ext)"

        let fullPath = getDocumentsDirectory().appendingPathComponent(path)

        do {
            try data.write(to: fullPath, options: [.atomic])

            // Make it ubiquitous

                if var ubiquityUrl = FileManager.default.url(forUbiquityContainerIdentifier: nil) {
                    ubiquityUrl = ubiquityUrl.appendingPathComponent("Documents/\(path)")
                    setUbiquitous(localUrl: fullPath, ubiquityUrl: ubiquityUrl)
                    print("Setting ubiquitous at \(ubiquityUrl)")

                }
                else {
                    print("Unable to access iCloud Account")
                    print("Open the Settings app and enter your Apple ID into iCloud settings")
                }

            return fullPath
        }
        catch let error {
            print("write(image:to:): failed with error \(error) – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding")
            return nil
        }
    }

    class func setUbiquitous(localUrl: URL, ubiquityUrl: URL) {

        do {
            try FileManager.default.setUbiquitous(true, itemAt: localUrl, destinationURL: ubiquityUrl)
        } catch let error {
            print("*** error: setUbiquitous failed \(error.localizedDescription)")
        }
    }

К сожалению, мне пока не удалось этого добиться. У меня есть эта ошибка:

Setting ubiquitous at file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~***~Tree/Documents/3481-4.jpg
*** error: setUbiquitous failed The file “3481-4.jpg” couldn’t be saved in the folder “***Tree” because a file with the same name already exists.

Как обновить существующие файлы?

Кроме того, я не вижу файлов в приложении «Настройки управления iCloud», так как моего приложения нет в списке (хотя оно указано в ручке до использования iCloud).

Примечание:

Согласно это, я добавил следующее в файл plist под ключом NSUbiquitousContainers, но я не уверен, какую роль это играет и действительно ли это связано с моим использованием iCloud.

<dict>
    <key>com.***.Tree</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
        <key>NSUbiquitousContainerName</key>
        <string>AppleTree</string>
    </dict>
</dict>

person Stéphane de Luca    schedule 07.02.2018    source источник
comment
У меня похожие проблемы. Вы решили свои проблемы? Я использую файл прав для своего приложения и задаюсь вопросом, нужно ли мне также устанавливать данные Info.plist, как вы описали выше.   -  person James Cramer    schedule 21.02.2018
comment
Неа. Я еще не придумал решение. Попросил друга посмотреть. Ожидание этого.   -  person Stéphane de Luca    schedule 21.02.2018
comment
Я закончил тем, что заставил его работать вчера. У меня есть как файл .entitlements, сгенерированный Xcode 9, так и ключ Info.plist, на который вы ссылались выше. Он начал работать после того, как я изменил идентификатор пакета своего проекта, и Xcode автоматически предоставил другой сертификат. После добавления файла в папку «Документы вездесущего контейнера» и использования setubiquitous это сработало.   -  person James Cramer    schedule 22.02.2018
comment
возможно, этот ответ поможет вам   -  person Sergei Volkov    schedule 11.01.2019
comment
Удалите существующий файл перед вызовом setUbiquitous(): try? fileManager.removeItem(at: ubiquityUrl)   -  person pipacs    schedule 10.06.2021