Docs Menu
Docs Home
/ /
Servicios de aplicaciones Atlas

Tutorial: Atlas Device Sync para Swift con Swift Interfaz de Usuario

Tiempo estimado para completar: 30 minutos, dependiendo de su experiencia con 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.

  • Inicie sesión en su cuenta con su correo electrónico y contraseña (y cierre sesión más tarde).

  • Ver, crear, modificar y eliminar sus propias tareas.

  • Ver todas las tareas, incluso aquellas en las que el usuario no es el propietario.

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.

Este tutorial se basa en la aplicación de plantillas. Agregará un nuevo priority campo al Item modelo existente y actualizará la suscripción de Sincronización flexible para mostrar solo elementos dentro de un rango de prioridades.

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:

  • Actualice un modelo de objeto de Realm con un cambio ininterrumpido.

  • Actualizar una suscripción de sincronización de dispositivos.

  • Agregue un campo consultable a la configuración de sincronización del dispositivo en el servidor para cambiar qué datos se sincronizan.

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.

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 de plantilla, la interfaz de usuario muestra un modal con la etiqueta Get the Front-end Code for your Template. Este modal proporciona instrucciones para descargar el código del cliente de la aplicación de plantilla como un archivo .zip o usar la CLI de App Services para 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 usa este proceso para obtener el código del cliente, debe crear una aplicación de plantilla para usarla con el cliente. Siga las instrucciones de "Crear una aplicación de plantilla" para usar la interfaz de usuario de Atlas App Services, la CLI de App Services o la API de administración para crear una aplicación de plantilla de Device Sync.

1

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.

2

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

AppConfig.swift

Este archivo contiene la lógica para leer appId y baseUrl desde Realm.plist. Está precargado con appId para su aplicación de plantilla.

App.swift

Este archivo usa los valores de AppConfig.swift para inicializar RealmSwift.App. App es la forma en que tu aplicación se comunica con el backend de App Services. Esto proporciona acceso al inicio de sesión y la autenticación. Este archivo también contiene el controlador de errores que detecta errores de sincronización de dispositivos.

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 a la aplicación SwiftUI. Pasamos el App al ContentView, que observa el estado de la aplicación para la autenticación del usuario.

En este tutorial, trabajará con los siguientes archivos:

Archivo
Propósito

Item.Swift

Este archivo, ubicado en la raíz del proyecto, define el objeto Realm que almacenamos en la base de datos.

CreateItemView.swift

Este archivo, ubicado en el directorio Views, proporciona la funcionalidad para agregar un nuevo elemento a la lista.

ContentView.Swift

Este archivo, ubicado en el directorio Views, define la suscripción de Flexible Sync.

3

Sin realizar ningún cambio en el código, debería poder ejecutar la aplicación en el simulador de iOS o en un dispositivo físico.

Ejecute la aplicación, registre una nueva cuenta de usuario y luego agregue un nuevo elemento a su lista de tareas pendientes.

4

Inicie sesión en Atlas App Services. En la pestaña, haga Data Services clic Browse Collections en. En la lista de bases de datos, busque y expanda la todo base de datos y, a continuación, la Item colección. Debería ver el documento que creó en esta colección.

1

Ahora que ha confirmado que todo funciona correctamente, podemos realizar cambios. En este tutorial, hemos decidido añadir una propiedad "priority" a cada elemento para poder filtrarlos por su prioridad. La propiedad "priority" utiliza una enumeración "PriorityLevel" para limitar los valores posibles.

Para ello siga estos pasos:

  1. Abra el App.xcodeproj en Xcode.

  2. Abra el archivo de clase Item.swift.

  3. Agregue la siguiente propiedad a la clase Item:

    @Persisted var priority: PriorityLevel
  4. Agregue también un PriorityLevel PersistableEnum debajo de la clase Item:

    class Item: Object, ObjectKeyIdentifiable {
    @Persisted(primaryKey: true) var _id: ObjectId
    @Persisted var isComplete = false
    @Persisted var summary: String
    @Persisted var owner_id: String
    @Persisted 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 Int en lugar de String para poder realizar consultas posteriormente según un nivel de prioridad numérico. Usamos la description propiedad calculada para mostrar una representación de cadena de la prioridad en la interfaz de usuario.

2
  1. En el directorio Views, vaya a CreateItemView.swift. Añada una nueva propiedad @State bajo la propiedad itemSummary existente. Por ahora, establezca el valor predeterminado en prioridad media:

    @State var itemSummary = ""
    @State var priority = PriorityLevel.medium
  2. Ahora, en el Form cuerpo, agregue un selector que permita al usuario elegir el nivel de prioridad del nuevo elemento. Localice el Section que contiene los botones e inserte el siguiente código encima:

    Section(header: Text("Priority")) {
    Picker(selection: $priority, label: Text("Set priority")) {
    ForEach(PriorityLevel.allCases, id: \.self) { priority in
    Text(priority.description)
    }
    }
    }
  3. Ahora, desplácese hasta Button(action:, que establece los valores de newItem cuando el usuario presiona el botón Save. Agregue una línea debajo de newItem.summary para establecer también la propiedad priority:

    newItem.summary = itemSummary
    newItem.priority = priority
3

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, regresa a la página de datos del Atlas en tu navegador y actualiza la Item colección. Deberías ver el nuevo elemento con el priority campo añadido y configurado como. El elemento existente no tiene 1 el priority campo.

Dos artículos en una colección
haga clic para ampliar

Nota

¿Por qué no se rompió esta sincronizar?

Añadir una propiedad a un objeto Realm no supone un cambio drástico y, por lo tanto, no requiere restablecer el cliente. La aplicación de plantilla tiene habilitado el modo de desarrollo, por lo que los cambios en el objeto Realm del cliente se reflejan en el esquema del servidor. Para obtener más información, consulte Modo de desarrollo y Actualizar el modelo de datos.

1

En el ContentView.swift archivo, creamos la suscripción de Sincronización Flexible que define los documentos que sincronizamos con el dispositivo y la cuenta del usuario. Busque la let config = user.flexibleSyncConfiguration(initialSubscriptions: variable donde configuramos las suscripciones iniciales. En el subscriptions.append() método, puede ver que actualmente nos suscribimos a todos los documentos cuya owner_id propiedad coincide con el ID del usuario autenticado. Queremos mantener esto, pero solo sincronizar los elementos con prioridad alta o severa.

Por eso, configuramos la PriorityLevel enumeración con el Int tipo, donde la prioridad más alta (grave) tiene un valor de 0 y la más baja (baja) tiene un valor 3 de. Podemos realizar comparaciones directas entre un entero y la propiedad de prioridad. Para ello, actualice la consulta para incluir documentos cuya prioridad sea igual o menor que PriorityLevel.High 1 (o), 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)
2

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

En este tutorial, al cambiar la suscripción y la consulta en el campo de prioridad por primera vez, este se añade automáticamente a la sincronización de dispositivos Collection Queryable Fields. Esto se debe a que la aplicación de plantilla tiene el modo de desarrollo habilitado de forma predeterminada. Si el modo de desarrollo no estuviera habilitado, tendría que añadir manualmente el campo como consultable para usarlo en una consulta de sincronización del lado del cliente.

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.

Agregar una propiedad a un objeto Realm existente es un cambio importante y el modo de desarrollo garantiza que el cambio de esquema se refleje en el lado del servidor.

Nota

Compartir comentarios

¿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.

Next

¿Qué son los servicios de aplicación Atlas?