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

Disable Realm Sync only for non-premium users

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

我正在寻找一些我能想到的方法来防止非高级用户触发 Realm Sync,但我不确定解决这个问题的最佳方法是什么。

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

编辑

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

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

这超级容易做到!

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

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?

使用同步解决方案连接到 MongoDB Realm 将添加其他文件并开始同步。如果这是一个 'premium' 的新用户,除了(最初)确保您的对象使用 _id 和 partitionKey 属性正确构建外,别无他法。

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

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

另一种选择是将领域对象导出为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.

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