Estimated time to complete: 30 minutes, depending on your experience with SwiftUI
Realm proporciona un SDK de Swift que permite crear una aplicación móvil nativa de iOS con Swift u Objective-C. Este tutorial se basa en la aplicación de plantilla de sincronización flexible de SwiftUI, llamada swiftui.todo.flex, que ilustra la creación de una aplicación de lista de tareas. Esta aplicación permite a los usuarios:
Registrar su correo electrónico como una nueva cuenta de usuario.
Sign in to their account with their email and password (and sign out later).
Ver, crear, modificar y eliminar sus propias tareas.
View all tasks, even where the user is not the owner.
La aplicación de plantilla también proporciona un interruptor que simula el dispositivo en modo sin conexión. Este interruptor permite probar rápidamente la sincronización del dispositivo en el simulador, simulando que el usuario no tiene conexión a internet. Sin embargo, es probable que este interruptor se elimine en una aplicación de producción.
This tutorial builds on the Template App. You will add a new priority field to the existing Item model and update the Flexible Sync subscription to only show items within a range of priorities.
Objetivos de aprendizaje
Este tutorial ilustra cómo adaptar la aplicación de plantilla a sus necesidades. Dada la estructura actual de la aplicación, no es necesario realizar este cambio.
En este tutorial aprenderás a:
Update a Realm object model with a non-breaking change.
Actualizar una suscripción de sincronización de dispositivos.
Add a queryable field to the Device Sync configuration on the server to change which data is synchronized.
Tip
Si prefieres comenzar con tu propia aplicación en lugar de seguir un tutorial guiado, consulta la Guía de inicio rápido de Swift. Incluye ejemplos de código copiables y la información esencial necesaria para configurar un backend de Atlas App Services.
Para una experiencia de inicio específica de SwiftUI, consulte el Inicio rápido de Realm con SwiftUI.
Requisitos previos
Asegúrate de tener instalado el software necesario. El SDK de Swift requiere Xcode. versión 13.1 o más reciente.
Este tutorial comienza con una aplicación de Plantilla. Necesitas una Cuenta de Atlas, una clave API y App Services CLI para crear una aplicación de plantilla.
Para obtener más información sobre cómo crear una cuenta de Atlas, consulte la sección Primeros pasos con Atlas. Para este tutorial, necesita una cuenta de Atlas con un clúster de nivel gratuito.
También necesita una clave API de Atlas para la cuenta de MongoDB Cloud con la que desea iniciar sesión. Debe ser propietario del proyecto para crear una aplicación de plantilla mediante la CLI de App Services.
Para aprender más sobre cómo instalar App Services CLI, consulta Instalar App Services CLI. Después de instalar, ejecuta el comando login utilizando la clave API de tu proyecto Atlas.
Comience con la plantilla
Este tutorial se basa en la plantilla de sincronización flexible de SwiftUI llamada swiftui.todo.flex. Comenzamos con la aplicación predeterminada y creamos nuevas funciones a partir de ella.
Para obtener más información sobre las aplicaciones de plantilla, consulte Aplicaciones de plantilla.
Si aún no tiene una cuenta Atlas, regístrese para implementar una aplicación de plantilla.
Siga el procedimiento descrito en la guía Crear una aplicación de servicios de aplicaciones y seleccione Create App from TemplateSeleccione la plantilla Real-time Sync. Esto crea una aplicación de Servicios de Aplicaciones preconfigurada para usarla con uno de los clientes de la plantilla de Sincronización de Dispositivos.
Después de crear una aplicación plantilla, la Interfaz de Usuario muestra un modal etiquetado como Get the Front-end Code for your Template. Este modal proporciona instrucciones para descargar el código cliente de la aplicación plantilla como un archivo .zip o para usar App Services CLI y obtener el cliente.
Después de seleccionar el método .zip o la CLI de App Services, siga las instrucciones en pantalla para obtener el código de cliente. Para este tutorial, seleccione el código de cliente SwiftUI (iOS + SwiftUI).
Nota
La utilidad ZIP predeterminada de Windows podría mostrar el archivo .zip vacío. Si esto ocurre, use un programa de compresión de terceros disponible.
El comando de creación de aplicaciones appservices configura el backend y crea una aplicación de plantilla SwiftUI para que la uses como base para este tutorial.
Ejecute el siguiente comando en una ventana de terminal para crear una aplicación llamada "MyTutorialApp" que se implementa en la región US-VA con su entorno configurado en "desarrollo" (en lugar de producción o control de calidad).
appservices app create \ --name MyTutorialApp \ --template swiftui.todo.flex \ --deployment-model global \ --environment development
El comando crea un nuevo directorio en su ruta actual con el mismo nombre que el valor del indicador --name.
Puedes bifurcar y clonar un repositorio de GitHub que contenga el código del cliente de Device Sync. El código del cliente SwiftUI está disponible en https://github.com/mongodb/template-app-swiftui-todo.
Si usas este proceso para obtener el código del cliente, debes crear una aplicación de plantilla para usar con el cliente. Sigue las instrucciones en Crear una aplicación de plantilla para usar la Interfaz de Usuario de Atlas App Services, los App Services CLI o la API de Administración para crear una aplicación de plantilla Device Sync.
Explora la aplicación plantilla
Abre la aplicación
Abra el App.xcodeproj del cliente frontend en Xcode.
Si descargaste el cliente como archivo .zip o clonaste su repositorio de GitHub, debes insertar manualmente el ID de la aplicación de App Services en el lugar correspondiente del cliente. Sigue las instrucciones Configuration del cliente README.md para saber dónde insertar el ID de la aplicación.
Explorar la estructura de la aplicación
Dedica unos minutos a explorar la organización del proyecto mientras el Administrador de Paquetes Swift descarga la última versión del SDK de Swift de Realm. En el directorio de la aplicación, puedes ver algunos archivos importantes:
Archivo | Propósito |
|---|---|
| Este archivo contiene la lógica para leer |
| Este archivo usa los valores de Para obtener más información sobre cómo puede personalizar la configuración de su aplicación, consulte: Conectarse a un backend de Atlas App Services. Este archivo también es el punto de entrada de la aplicación SwiftUI. Pasamos el |
In this tutorial, you'll be working in the following files:
Archivo | Propósito |
|---|---|
| This file, located at the root of the project, defines the Realm object we store in the database. |
| Este archivo, ubicado en el directorio |
| Este archivo, ubicado en el directorio |
Comprueba el Backend
Inicia sesión en Atlas App Services. En la pestaña Data Services, haz clic en Browse Collections. En la lista de bases de datos, busca y expande la base de datos todo y luego la colección Item. Debería ver el documento que creó en esta colección.
Modificar la aplicación
Agregar una nueva propiedad
Agregar una propiedad al modelo
Now that you have confirmed everything is working as expected, we can add changes. In this tutorial, we have decided that we want to add a "priority" property to each Item so that we can filter Items by their priorities. The priority property uses a PriorityLevel enum to constrain the possible values.
Para ello siga estos pasos:
Abre el
App.xcodeprojen Xcode.Abra el archivo de clase
Item.swift.Agregue la siguiente propiedad a la clase
Item:var priority: PriorityLevel Agregue también un PriorityLevel
PersistableEnumdebajo de la claseItem:class Item: Object, ObjectKeyIdentifiable { (primaryKey: true) var _id: ObjectId var isComplete = false var summary: String var owner_id: String var priority: PriorityLevel } enum PriorityLevel: Int, PersistableEnum, CaseIterable { case severe = 0 case high = 1 case medium = 2 case low = 3 var description: String { switch self { case .severe: return "Severe" case .high: return "High" case .medium: return "Medium" case .low: return "Low" } } } PersistableEnum es el protocolo que marca los tipos de enumeración como persistentes directamente en Realm. Aquí, el tipo de la enumeración se establece como
Inten lugar deStringpara poder realizar consultas posteriormente según un nivel de prioridad numérico. Usamos ladescriptionpropiedad calculada para mostrar una representación de cadena de la prioridad en la interfaz de usuario.
Establecer la prioridad al crear un nuevo elemento
In the
Viewsdirectory, go toCreateItemView.swift. Add a new@Stateproperty under the existingitemSummaryproperty. For now, set the default value to medium priority:var itemSummary = "" var priority = PriorityLevel.medium Now, in the
Formbody, add a Picker that enables the user to choose which priority level to set on the new Item. Locate theSectionthat contains the buttons, and insert the following code above it:Section(header: Text("Priority")) { Picker(selection: $priority, label: Text("Set priority")) { ForEach(PriorityLevel.allCases, id: \.self) { priority in Text(priority.description) } } } Ahora, pasa al
Button(action:que configura los valores de losnewItemcuando el usuario presiona el botónSave. Agrega una línea debajo denewItem.summarypara configurar también la propiedadpriority:newItem.summary = itemSummary newItem.priority = priority
Ejecutar y probar
En este punto, puede volver a ejecutar la aplicación. Inicie sesión con la cuenta que creó anteriormente en este tutorial. Verá el elemento que creó anteriormente. Añada un nuevo elemento y verá que ahora puede establecer la prioridad. Seleccione High como prioridad y guarde el elemento.
Ahora, regrese a la página de datos del Atlas en su navegador y actualice la Item colección. Debería ver el nuevo elemento con el priority campo agregado y configurado en 1. El elemento existente no tiene el priority campo.

Nota
¿Por qué no se rompió esta sincronizar?
Adding a property to a Realm object is not a breaking change and therefore does not require a client reset. The template app has Development Mode enabled, so changes to the client Realm object are reflected in the server-side schema. For more information, see Development Mode and Update Your Data Model.
Cambiar la suscripción
Update the subscription
In the ContentView.swift file, we create the Flexible Sync subscription that defines which documents we sync with the user's device & account. Look for the let config = user.flexibleSyncConfiguration(initialSubscriptions: variable where we set the initial subscriptions. Within the subscriptions.append() method, you can see that we are currently subscribing to all documents where the owner_id property matches the authenticated user's id. We want to maintain that, but only sync Items that are marked as High or Severe priority.
Por esto, establecemos el enum de PriorityLevel al tipo Int, donde la máxima prioridad (grave) tiene un valor de 0, y la prioridad más baja (baja) tiene un valor de 3. Podemos hacer comparaciones directas entre un Int y la propiedad de prioridad. Para ello, actualiza la instrucción de query para incluir documentos cuya prioridad sea igual o inferior a PriorityLevel.High (o a 1), como se muestra aquí.
También agregaremos el valor booleano reRunOnOpen y lo estableceremos en true para forzar la consulta de suscripción a recalcular qué documentos sincronizar cada vez que abramos la aplicación.
let config = user.flexibleSyncConfiguration(initialSubscriptions: { subs in if let foundSubscription = subs.first(named: Constants.myItems) { foundSubscription.updateQuery(toType: Item.self, where: { $0.owner_id == user.id && $0.priority <= PriorityLevel.high }) } else { // No subscription - create it subs.append(QuerySubscription<Item>(name: Constants.myItems) { $0.owner_id == user.id && $0.priority <= PriorityLevel.high }) } }, rerunOnOpen: true)
Ejecutar y probar
Ejecute la aplicación de nuevo. Inicie sesión con la cuenta que creó anteriormente en este tutorial. Dado que añadimos reRunOnOpen, la aplicación debería resincronizar solo los documentos que coincidan con la consulta de sincronización flexible. Tras un momento inicial, cuando Realm resincroniza la colección de documentos, solo verá el nuevo elemento de alta prioridad que creó.
El documento de elemento que creó inicialmente no está sincronizado porque no tiene el campo priority. Si desea que este elemento se sincronice, puede editarlo en la interfaz de usuario de Atlas y agregar un valor al campo de prioridad.
Tip
Cambiar suscripciones con el modo de desarrollador habilitado
In this tutorial, when you change the subscription and query on the priority field for the first time, the field is automatically added to the Device Sync Collection Queryable Fields. This occurs because the template app has Development Mode enabled by default. If Development Mode was not enabled, you would have to manually add the field as a queryable field to use it in a client-side Sync query.
Para obtener más información, consulte Campos consultables.
Si desea probar la funcionalidad con más detalle, puede crear elementos con diferentes prioridades. Verá que un nuevo elemento con menor prioridad aparece brevemente en la lista de elementos y luego desaparece. El gestor de errores de sincronización proporciona un mensaje que describe este comportamiento:
ERROR "Client attempted a write that is outside of permissions or query filters; it has been reverted"
También puedes ver este mensaje en el registro de la consola.
En este escenario, Realm crea el elemento localmente, lo sincroniza con el backend y luego revierte la escritura porque no cumple con las reglas de suscripción.
Conclusión
Agregar una propiedad a un objeto Realm existente es un cambio no disruptivo, y el modo de desarrollo asegura que el cambio de esquema se refleje en el servidor.
¿Qué es lo próximo?
Considere agregar la nueva propiedad
Prioritya las vistasItemList,ItemRowyItemDetail.Find developer-oriented blog posts and integration tutorials on the MongoDB Developer Hub.
Únase a las comunidades de MongoDB en Reddit o Stack Overflow para aprender de otros desarrolladores y expertos técnicos de MongoDB.
Explore proyectos de ingeniería y ejemplos proporcionados por expertos.
Nota
Share Feedback
¿Cómo te fue? Usa el Rate this page widget en la parte inferior derecha de la página para evaluar su efectividad. O reporta un problema en el repositorio de GitHub si tuviste algún problema.