仅对非高级用户禁用领域同步

Sid*_*ria 7 realm mongodb ios mongodb-realm

我正在创建一个 iOS 应用程序,我打算仅向高级用户提供跨设备数据同步功能。我发现Realm Sync是一个很好的解决方案,可以保持本地设备上数据库和云 MongoDB Atlas 同步。但是,我不想将非高级用户的数据同步到云数据库。

我列出了几种我能想到的方法来防止非高级用户触发领域同步,但我不确定解决此问题的最佳方法是什么。

  • 通过利用同步权限来防止同步- 我可以存储高级用户 ID 列表,并且只向这些用户授予同步权限。

     {
       "%%user.id": [
          "5f4863e4d49bd2191ff1e623",
          "5f48640dd49bd2191ff1e624",
          "5f486417d49bd2191ff1e625"
       ]
     } 
    
    Run Code Online (Sandbox Code Playgroud)
  • 在客户端配置 Realm 对象,即如果用户是高级用户,则仅允许所有 Realm 对象/模型。

     // Get a configuration to open the synced realm.
     var configuration = user.configuration(partitionValue: "user=\(user.id)")
     // For non-premium user it would be [User.self]
     configuration.objectTypes = [User.self, Project.self] 
     Realm.asyncOpen(configuration: configuration) { [weak self](result) in /*...*/ }
    
    Run Code Online (Sandbox Code Playgroud)

我正在寻找解决此问题的见解/推荐方法。

编辑

我还有一些关于以不同方式处理两种用例的其他问题 - 非高级用例仅打开本地Realm(),高级用例则使用Realm.asyncOpen().

  1. 当现有用户切换到高级订阅时如何处理用例?打电话就Realm.asyncOpen()足够了还是需要做任何特殊处理?
  2. 我计划User为所有用户(高级+非高级)同步所有(集合中的自定义文档)记录。我的猜测是我应该为我的所有内容打开一个普通的领域,并仅使用[User.self]配置中的对象来同步领域。

Jay*_*Jay 8

这非常容易做到!

当您只想使用本地领域时,无需配置即可连接到它 - 像这样

let realm = try! Realm()
let someObject = realm.results(SomeObject.self)
Run Code Online (Sandbox Code Playgroud)

或可能包含本地文件名的配置。所有应用程序数据都只能在本地读取和写入,不会同步。

当您想使用 MongoDB Realm Sync 时,请像这样连接到它

let app = App(id: YOUR_REALM_APP_ID)
// Log in...
let user = app.currentUser
let partitionValue = "some partition value"
var configuration = user!.configuration(partitionValue: partitionValue)
Realm.asyncOpen(configuration: configuration) { result in
    switch result {
    case .failure(let error):
        print("Failed to open realm: \(error.localizedDescription)")
        // handle error
    case .success(let realm):
        print("Successfully opened realm: \(realm)")
        // Use realm
    }
}
Run Code Online (Sandbox Code Playgroud)

然后再进行配置

let config = user?.configuration(partitionValue: "some partition")
let realm = try! Realm(configuration: config)
Run Code Online (Sandbox Code Playgroud)

编辑

回答两个后续问题:

当现有用户切换到高级订阅时如何处理用例?调用 Realm.asyncOpen() 就足够了还是我需要做任何特殊处理?

使用 Sync'ding 解决方案连接到 MongoDB Realm 将添加其他文件并开始同步。如果这是一个“高级”新用户,除了(最初)确保您的对象使用 _id 和partitionKey 属性正确构建之外,没有其他可做的。

如果该用户从非高级本地仅升级到同步的高级,您将需要将领域对象从仅本地领域复制到同步领域。

有几种方法可以做到这一点;可能最简单的方法是在应用程序中包含代码,然后在升级时连接到同步领域(使用 .async),然后连接到现有的本地领域,最后迭代对象以复制到同步领域。

另一种选择是将领域对象导出为 JSON,然后将它们直接写入服务器。下次您的应用程序与 .async 连接时,它将强制客户端重置并下载并创建本地同步文件。Realm Legacy Migration Guide中提供了一些可能有助于此特定过程的信息

我计划同步所有用户(高级+非高级)的所有用户(集合中的自定义文档)记录。我的猜测是我应该为我的所有内容打开一个普通的 Realm,并仅使用配置中的 [User.self] 对象来同步 Realm。

非高级用户不会同步,因此他们并不是真正的“用户”。您不需要存储它们或同步它们,因此您实际上不需要任何身份验证或在服务器上存储任何数据 - 它只是一个本地运行和使用的应用程序,因此甚至不需要担心“用户”对象。一旦他们升级,您将需要这样做。