如何将文件备份到iCloud但未显示在iCloud Drive中?

发布于 2025-01-21 23:05:19 字数 2562 浏览 2 评论 0原文

我通过使用fileManage方法备份数据库领域文件。一切正常,但是我想实现的一个技巧是:

该文件应由iCloud备份,但在iCloud drive中不显示。

例如,GoodNotes 5,我们可以在设置中打开iCloud,验证它是iCloud存储中的真正备份,而GoodNots 5应用程序文件未显示在iCloud Drive中。

以下是我的代码,该代码实现了iCloud备份,但是应用程序文件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)
        }
    }
}

I'm backup my database realm file to iCloud by using FileManage methods. Everything works fine, but there's a trick I want to achieve is:

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

For example, GoodNotes 5, we can open the iCloud in settings, verify it's truly backup in iCloud Storage, and the GoodNots 5 App File is not shown in iCloud Drive.
enter image description here

Below is my code that implement iCloud backup, but the App File ama will be shown in 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)
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

平安喜乐 2025-01-28 23:05:19

经过多次测试,为避免备份文件到iCloud驱动器,但是在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驱动器中未显示。

After many tests, to avoid backup file to iCloud Drive, but in iCloud container, you can just simply remove the 'Documents' path, but using file path directly, like below:

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

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

change to:

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

In this case, the backup file will be stored in iCloud container, but not shown in the user's iCloud Drive.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文