ios - 仅为非高级用户禁用 Realm 同步

标签 ios mongodb realm mongodb-realm

我正在创建一个 iOS 应用程序,我打算在其中提供跨设备功能的数据同步,仅适用于高级用户。我找 Realm Sync作为保持本地设备数据库和云 MongoDB Atlas 同步的一个很好的解决方案。但是,我不想将非高级用户的数据同步到云数据库。
我采用了几种我能想到的方法来防止 Realm Sync 为非高级用户触发,但我不确定解决此问题的最佳方法是什么。

  • 通过利用 Sync permissions 防止同步- 我可以存储高级用户 ID 列表,并且只向这些用户授予同步权限。
     {
       "%%user.id": [
          "5f4863e4d49bd2191ff1e623",
          "5f48640dd49bd2191ff1e624",
          "5f486417d49bd2191ff1e625"
       ]
     } 
    
  • Configure Realm objects在客户端,即如果用户是高级用户,则只允许所有 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 /*...*/ }
    

  • 我正在寻找解决此问题的见解/推荐方法。
    编辑
    我还有一些关于以不同方式处理两个用例的其他问题 - 通过仅打开本地用例来处理非高级用例 Realm()以及带有 Realm.asyncOpen() 的高级版.
  • 当现有用户切换到高级订阅时如何处理用例?应调用Realm.asyncOpen()就足够了还是我需要做任何特殊处理?
  • 我计划同步我所有的 User (集合中的自定义文档)记录所有用户(高级 + 非高级)。我的猜测是我应该为我的所有内容打开一个普通的 Realm 并且只用 [User.self] 同步 Realm配置中的对象。
  • 最佳答案

    这非常容易做到!
    当您只想使用本地 Realm 时,无需配置即可连接到它 - 像这样

    let realm = try! Realm()
    let someObject = realm.results(SomeObject.self)
    
    或可能包含本地文件名的配置。所有的应用程序数据只会在本地读取和写入,没有同步。
    当你想使用 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
        }
    }
    
    然后用一个配置
    let config = user?.configuration(partitionValue: "some partition")
    let realm = try! Realm(configuration: config)
    
    编辑
    回答两个后续问题:

    How to handle a use case when an existing user switches to a premium subscription? Should calling Realm.asyncOpen() suffice or do I need to do any special handling?


    使用 Sync'ding 解决方案连接到 MongoDB Realm 将添加其他文件并开始同步。如果这是一个“高级”的新用户,除了(最初)确保您的对象使用 _id 和 partitionKey 属性正确构建之外,别无他法。
    如果此用户仅从非高级本地升级到已同步的高级,您将需要将 Realm 对象从仅限本地 Realm 复制到同步 Realm 。
    有几种方法可以做到这一点;最简单的方法可能是在您的应用程序中包含代码,然后在升级时连接到同步 Realm (使用 .async),然后连接到您现有的本地 Realm ,最后遍历对象以复制到同步 Realm 。
    另一种选择是将 Realm 对象导出为 JSON,然后直接将它们写入服务器。下次您的应用程序与 .async 连接时,它将强制客户端重置并下载并创建本地同步文件。在 Realm Legacy Migration Guide 中有一些可能有助于此特定过程的信息。

    I plan to sync all my User (custom document in a collection) records for all users (premium + non-premium). My guess is I should open a normal Realm for all my conent and synced Realm with just [User.self] object in the configuration.


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

    关于ios - 仅为非高级用户禁用 Realm 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66565463/

    相关文章:

    ios - 从 sqlite 表获取数据时出现问题

    python - 如何使用Python提取Mongo中的集合?

    javascript - 使用 ".create"时如何使用 Mongoose 添加到数组中的对象

    swift - 如何在Realm DB Swift中更新对象列表

    swift - Realm 中的索引属性

    ios - -[AVMvidFrameDecoder advanceToFrame :] 'framebuffer num bytes' 中的 AVAnimator 断言失败

    ios - 无法将自定义字体添加到 Xcode

    iOS:以编程方式创建的 UINavigationController 的导航栏未扩展到安全区域

    node.js - Mongodb 模式在几秒后清空

    java - 将 Realm 角色和资源角色与 Keycloak/Spring Security 一起使用