Estoy creando una aplicación iOS, en la que tengo la intención de proporcionar sincronización de datos a través de la función del dispositivo, solo para los usuarios premium. Creo que Realm Sync es una buena solución para mantener sincronizadas la base de datos local del dispositivo y MongoDB Atlas en la nube. Sin embargo, no quiero sincronizar los datos de los usuarios no premium con la base de datos en la nube.
Incluyo un par de formas en las que puedo pensar para evitar que Realm Sync se active para usuarios no premium, pero no estoy seguro de cuál es la mejor manera para este problema.
Evite la sincronización aprovechando los permisos de sincronización: puedo almacenar una lista de identificaciones de usuario premium y solo otorgar permisos de sincronización a esos usuarios.
{ "%%user.id": [ "5f4863e4d49bd2191ff1e623", "5f48640dd49bd2191ff1e624", "5f486417d49bd2191ff1e625" ] }Configure los objetos de Realm en el lado del cliente, es decir, solo permita todos los objetos/modelos de Realm si el usuario es premium.
// 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 /*...*/ }Estoy buscando ideas / enfoque recomendado para este problema.
Editar
Tengo algunas preguntas adicionales sobre el manejo de dos casos de uso diferentes: uno no premium al abrir un Realm() solo local y el premium con Realm.asyncOpen() .
Realm.asyncOpen() o necesito hacer algún manejo especial?User (documento personalizado en una colección) para todos los usuarios (premium + no premium). Supongo que debería abrir un Realm normal para todo mi contenido y Realm sincronizado con solo el objeto [User.self] en la configuración.¡Esto es muy fácil de hacer!
Cuando solo desee trabajar con un reino local, conéctese a él sin configuración, como este
let realm = try! Realm() let someObject = realm.results(SomeObject.self)o una configuración que tal vez contenga un nombre de archivo local. Todos los datos de la aplicación solo se leerán y escribirán localmente sin sincronización.
Cuando desee utilizar MongoDB Realm Sync, conéctese a él de esta manera
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 } }y luego con una configuración
let config = user?.configuration(partitionValue: "some partition") let realm = try! Realm(configuration: config)EDITAR
Respondiendo a las dos preguntas de seguimiento:
¿Cómo manejar un caso de uso cuando un usuario existente cambia a una suscripción premium? ¿Debería bastar con llamar a Realm.asyncOpen() o necesito hacer algún manejo especial?
Conectarse a MongoDB Realm con la solución Sync'ding agregará archivos adicionales y comenzará la sincronización. Si se trata de un usuario nuevo que es 'premium', no hay nada más que hacer, aparte de (inicialmente) asegurarse de que sus objetos estén estructurados correctamente con las propiedades _id y particiónKey.
Si este usuario está actualizando de un local no premium solo a un premium que está sincronizado, deberá copiar sus objetos de dominio del dominio solo local a un dominio sincronizado.
Hay varias formas de hacerlo; probablemente lo más simple es incluir código en su aplicación y luego, al actualizar, se conecta a un reino de sincronización (usando .async), luego se conecta a su reino local existente y finalmente itera sobre los objetos para copiarlos al reino sincronizado.
Otra opción es exportar los objetos del reino como JSON y luego escribirlos directamente en el servidor. La próxima vez que su aplicación se conecte con .async, forzará un restablecimiento del cliente y descargará y creará los archivos sincronizados localmente. Hay algunos fragmentos de información que pueden ayudar con este proceso en particular en la Guía de migración de Realm Legacy.
Planeo sincronizar todos mis registros de Usuario (documento personalizado en una colección) para todos los usuarios (premium + no premium). Supongo que debería abrir un Realm normal para todo mi contenido y Realm sincronizado con solo el objeto [User.self] en la configuración.
Los usuarios no premium no se sincronizan, por lo que no son realmente "usuarios" como tales. No necesitaría almacenarlos ni sincronizarlos, por lo que realmente no necesita ninguna autenticación ni almacenar ningún dato en el servidor; es solo una aplicación que se ejecuta y usa localmente, por lo que ni siquiera hay un objeto de "usuario" por el que preocuparse. . Deberá hacerlo una vez que se actualicen.