备份领域到iCloud Drive

Luc*_*tti 6 objective-c realm ios swift

我想将一个领域数据库文件备份到一个iCloud驱动器,比如WhatsApp,我有一些问题:

  1. 这样做的最佳做法是什么?

  2. 我有一个位于共享组文件夹中的数据库,可以从扩展程序访问它,我该如何备份它?如何显示上传的进度条?像WhatsApp一样?

  3. 如果我将一个领域文件放在一个文档文件夹中,它将为每个修改同步.

  4. 我们可以看到一些示例代码吗?

谢谢你的帮助,有什么想法吗?链接?

TiM*_*TiM 9

只是为了澄清,这是一个关于将离散Realm文件本身备份到iCloud Drive的问题,以便它可以在iCloud Drive应用程序中看到.不将文件内容同步到CloudKit存储.

如果将Realm文件保留在Documents目录中,则如果用户执行iCloud或iTunes备份,则将备份该文件.所有这些意味着,如果用户决定升级到新设备并使用旧设备的备份映像执行还原,则将恢复Realm文件.如果用户在此之前从旧设备中删除了应用程序,则iCloud备份也将被删除.

如果要导出Realm文件以便可以在iCloud Drive中永久保存和访问,您可以将Realm文件的副本导出到应用程序的iCloud ubiquity容器中.这基本上只是另一个文件夹,如共享组的文件夹,但它由iCloud管理.此文件夹的行为类似于Dropbox,因为您放入的任何内容都会自动同步.

代码看起来像这样:

let containerURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)
let realmArchiveURL = containerURL.appendPathComponent("MyArchivedRealm.realm")

let realm = try! Realm()
try! realm.writeCopy(toFile: realmArchiveURL)
Run Code Online (Sandbox Code Playgroud)

这是一个非常基本的例子.Apple文档建议您在后台线程上执行此操作,因为首次设置iCloud文件夹可能会创建一些时间.

更新此操作不会自动进行.每次用户想要执行备份时,您都需要导出Realm的新副本.


Ani*_*ita 6

我最近有相同的要求,我能够从以下步骤实现

斯威夫特:4+

第1步

 1.Setup Your cloudKit for your app with a Developer account
 2. You can take reference: https://www.raywenderlich.com/1000-cloudkit-tutorial-getting-started 
Run Code Online (Sandbox Code Playgroud)

第2步

 - Add CloudKit Capabilities in your App
 - Please check out the screenshot: https://prnt.sc/pdpda5
Run Code Online (Sandbox Code Playgroud)

第 3 步 - 检查您 iphone 的启用云选项

// Return true if iCloud is enabled

func isCloudEnabled() -> Bool {
    if DocumentsDirectory.iCloudDocumentsURL != nil { return true }
    else { return false }
}
Run Code Online (Sandbox Code Playgroud)

第 4 步 - 为本地或 iCloud 文档目录设置以下变量

struct DocumentsDirectory {
    static let localDocumentsURL = FileManager.default.urls(for: FileManager.SearchPathDirectory.documentDirectory, in: .userDomainMask).last!
    static let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")
}
Run Code Online (Sandbox Code Playgroud)

步骤:5 下面的函数用于 copyRealmFileToIcloudContainer

func uploadDatabaseToCloudDrive()
{
    if(isCloudEnabled() == false)
    {
        self.iCloudSetupNotAvailable()
        return
    }

    let fileManager = FileManager.default

    self.checkForExistingDir()

    let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents", isDirectory: true)

    let iCloudDocumentToCheckURL = iCloudDocumentsURL?.appendingPathComponent("\(memberId)_default.realm", isDirectory: false)

    let realmArchiveURL = iCloudDocumentToCheckURL//containerURL?.appendingPathComponent("MyArchivedRealm.realm")

    if(fileManager.fileExists(atPath: realmArchiveURL?.path ?? ""))
    {
        do
        {
            try fileManager.removeItem(at: realmArchiveURL!)
            print("REPLACE")
            let realm = try! Realm()
            try! realm.writeCopy(toFile: realmArchiveURL!)

        }catch
        {
            print("ERR")
        }
    }
    else
    {
        print("Need to store ")
        let realm = try! Realm()
        try! realm.writeCopy(toFile: realmArchiveURL!)
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤:6

 - Once your realm file uploaded on the server , you can check this in your iPhone
 - Steps
     - 1.Go To Setting
     - 2.Go To iCloud
     - 3.Go To ManageStorage
     - 4.You will see your application there
     - 5.Tap on Application, you will able to see your realm file over there
Run Code Online (Sandbox Code Playgroud)

步骤:7 - 确保您在 info.plist 中添加了以下几行

<key>NSUbiquitousContainers</key>
<dict>
    <key>iCloud.com.example.app</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerName</key>
        <string>iCloudDemoApp</string>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
    </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)


Bog*_*rca 2

你可以看看这个Github 项目mikemac8888

基本上,您使模型对象符合RealmCloudObject

class Note: Object, RealmCloudObject {
  ...
}
Run Code Online (Sandbox Code Playgroud)

你必须实现一个映射函数:

func toRecord() -> CKRecord {
  ...
  record["text"] = self.text
  record["dateModified"] = self.dateModified
}
Run Code Online (Sandbox Code Playgroud)

...以及用于从 CloudKit 记录创建 Realm 记录的反向函数:

public func changeLocalRecord(...) throws {
  ...
  realm.create(objectClass as! Object.Type,
      value: ["id": id,
          "text": text,
          "dateModified": NSDate(),
          "ckSystemFields": recordToLocalData(record)],
      update: true)

  ...
}
Run Code Online (Sandbox Code Playgroud)

显然,可以在我提供的链接中阅读完整的文档。