【问题标题】:How to backup file to iCloud but not shown in iCloud Drive?如何将文件备份到 iCloud 但未显示在 iCloud Drive 中?
【发布时间】:2022-07-15 19:05:34
【问题描述】:

我正在使用FileManage 方法将我的数据库领域文件备份到 iCloud。一切正常,但我想要实现的一个技巧是:

The file should be backup by iCloud, but NOT shown in iCloud Drive.

比如GoodNotes 5,我们可以在设置中打开iCloud,确认它是真的备份在iCloud Storage中,GoodNots 5 App File没有显示在iCloud Drive中。

以下是我实现 iCloud 备份的代码,但 App File ama 将显示在 iCloud Drive 中:

private func retrieveLocalRealmURL() -> URL {
    let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentaryDirectory = urls[0]
    let realmURL = documentaryDirectory.appendingPathComponent("ama.realm");
    
    return realmURL
}

private func backupRealmToiCloudDrive() {
    let backgroundQueue = DispatchQueue.global(qos: .background)
    
    backgroundQueue.async {
        guard
            let ubiquityURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)
        else {
            return
        }
            
        let iCloudDriveURL = ubiquityURL.appendingPathComponent("Documents")
        let iCloudRealmURL = iCloudDriveURL.appendingPathComponent("ama.realm")
        
        let fileExists = FileManager.default.fileExists(atPath: iCloudDriveURL.path, isDirectory: nil)
        
        func copy() {
            let localRealmURL = self.retrieveLocalRealmURL()
            
            do {
                try FileManager.default.copyItem(at: localRealmURL, to: iCloudRealmURL)
            } catch {
                printLog(error.localizedDescription)
            }
        }
        
        if fileExists {
            self.deleteExistedFile(iCloudRealmURL)
            copy()
        } else {
            do {
                try FileManager.default.createDirectory(at: iCloudDriveURL, withIntermediateDirectories: true, attributes: nil)
                copy()
            } catch {
                printLog(error.localizedDescription)
            }
        }
    }
}

private func deleteExistedFile(_ url: URL) {
    let fileCoordinator = NSFileCoordinator(filePresenter: nil)
    
    fileCoordinator.coordinate(writingItemAt: url, options: .forDeleting, error: nil) { deleteURL in
        do {
            let fileExists = FileManager.default.fileExists(atPath: deleteURL.path, isDirectory: nil)
            
            if fileExists {
                try FileManager.default.removeItem(at: deleteURL)
            }
        } catch {
            printLog(error.localizedDescription)
        }
    }
}

【问题讨论】:

  • 你发现了吗?
  • 嗨@Andres,是的,它已经解决了,请看我自己的答案。

标签: swift icloud icloud-drive


【解决方案1】:

经过多次测试,为避免将文件备份到 iCloud Drive,但在 iCloud 容器中,您可以简单地删除“文档”路径,而是直接使用文件路径,如下所示:

let ubiquityURL = FileManager.default.url(forUbiquityContainerIdentifier: "identifier.abcdefg")

let iCloudDriveURL = ubiquityURL.appendingPathComponent("Documents") //remove this line
let iCloudRealmURL = iCloudDriveURL.appendingPathComponent("ama.realm")

改为:

let iCloudRealmURL = ubiquityURL.appendingPathComponent("ama.realm") //appending to ubiquityURL directly

在这种情况下,备份文件将存储在 iCloud 容器中,但不会显示在用户的 iCloud Drive 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多