Menu Docs

Página inicial do DocsServiços Atlas App

Tutorial: Atlas Device Sync para Swift com Swift UI

Nesta página

  • Objetivos de aprendizagem
  • Pré-requisitos
  • Comece com o Modelo
  • Explore o aplicativo Template
  • Abra o aplicativo
  • Explore a estrutura do aplicativo
  • Execute o aplicativo
  • Verificar o Backend
  • Modificar a Aplicação
  • Adicionar uma nova propriedade
  • Adicionar uma propriedade ao modelo
  • Definir a prioridade ao criar um novo item
  • Executar e testar
  • Alterar a assinatura
  • Atualizar a assinatura
  • Executar e testar
  • Conclusão
  • O que vem a seguir?

Tempo estimado para conclusão: 30 minutos, dependendo da sua experiência com o SwiftUI

O Realm oferece um SDK Swift que permite criar um aplicativo móvel para iOS nativo com Swift ou Objective-C. Esse tutorial baseia-se no aplicativo SwiftUI Flexible Sync Template App, denominado swiftui.todo.flex, que ilustra a criação de um aplicativo de lista de tarefas. Este aplicativo permite que os usuários:

  • Registre seu e-mail como uma nova conta de usuário.

  • Faça login na conta deles com o e-mail e a senha (e saia mais tarde).

  • Visualize, crie, modifique e exclua suas próprias tarefas.

  • Visualizar todas as tarefas, mesmo onde o usuário não é o proprietário.

O aplicativo de modelo também oferece uma alternância que simula o dispositivo no "Modo Offline". Essa alternância permite que você teste rapidamente a funcionalidade Device Sync no simulador, emulando o usuário que não tem conexão com a Internet. No entanto, você provavelmente removeria essa opção em um aplicativo de produção.

Este tutorial baseia-se no aplicativo Modelo. Você adicionará um novo campo priority ao modelo de Item existente e atualizará a assinatura do Flexible Sync para mostrar apenas itens dentro de uma variedade de prioridades.

Este tutorial ilustra como você pode adaptar o aplicativo modelo para suas próprias necessidades. Você não faria necessariamente esta alteração dada a estrutura atual do aplicativo modelo.

Neste tutorial, você aprenderá como:

  • Atualize um modelo de objeto Realm com uma alteração não inovadora.

  • Atualizar uma inscrição do Device Sync.

  • Adicione um campo de query à configuração do Device Sync no servidor para alterar quais dados são sincronizados.

Dica

Se você preferir começar com seu próprio aplicativo em vez de seguir um tutorial guiado, confira o Swifty Quick Start. Ele inclui exemplos de código copiáveis e as informações essenciais necessárias para configurar um backend de Atlas App Services.

Para uma experiência de introdução específica do SwiftUI, consulte o Realm with SwiftUI QuickStart.

  • Este tutorial começa com um aplicativo de modelo. Você precisa de uma Conta Atlas, uma chave de API e appservices para criar um Aplicativo Modelo.

    • Você pode aprender mais sobre a criação de uma conta do Atlas na documentação de Comece a usar o Atlas. Para este tutorial, você precisa de uma conta do Atlas com um cluster de camada livre.

    • Você também precisa de uma chave de API Atlas para a conta do MongoDB Cloud com a qual deseja fazer login. Você deve ser proprietário do projeto para criar um aplicativo modelo usando appservices.

    • Para saber mais sobre como instalar serviços de aplicativos, consulte Instalar CLI do App Services. Após instalar, execute o comando login utilizando a chave API para seu projeto Atlas.

Este tutorial baseia-se no aplicativo de sincronização flexível SwiftUI denominado swiftui.todo.flex. Começamos com o aplicativo padrão e construímos novos recursos nele.

Para saber mais sobre os aplicativos de modelo, consulte Aplicativos de modelo.

Se você ainda não tiver uma conta do Atlas, cadastre-se para implantar um Aplicativo Modelo.

1

Abra o App.xcodeproj do cliente frontend no Xcode.

Se você baixou o cliente como um arquivo .zip ou clonou o repositório GitHub do cliente, você deverá inserir manualmente o ID do aplicativo App Services no local apropriado em seu cliente. Siga as instruções Configuration no cliente README.md para saber onde inserir seu ID do aplicativo.

2

Reserve alguns minutos para explorar como o projeto está organizado enquanto o Swift Package Manager baixa a versão mais recente do Realm Swift SDK. No diretório App, você pode ver alguns arquivos dignos de nota:

arquivo
Propósito
AppConfig.swift
Esse arquivo contém a lógica para ler os appId e baseUrl do Realm.plist. Isso é pré-preenchido com o appId para seu aplicativo modelo.
App.swift

Este arquivo utiliza os valores de AppConfig.swift para inicializar o RealmSwift.App. O App é como seu aplicativo se comunica com o back-end dos Serviços de Aplicativo. Isso fornece acesso ao login e autenticação. Este arquivo também contém o manipulador de erros que escuta erros do Atlas Device Sync.

Para saber mais sobre como personalizar a configuração do seu aplicativo, consulte: Conectar-se a um backend do Atlas App Services.

Este arquivo também é o ponto de entrada para o aplicativo SwiftUI. Passamos o App para o ContentView que observa o estado do aplicativo para o estado de autenticação do usuário.

Neste tutorial, você estará trabalhando nos seguintes arquivos:

arquivo
Propósito
Item.Swift
Este arquivo, localizado na raiz do projeto, define o objeto do Realm que armazenamos no banco de dados.
CreateItemView.swift
Este arquivo, localizado no diretório Views, fornece a funcionalidade para adicionar um novo item na lista.
ContentView.Swift
Este arquivo, localizado no diretório Views, define a assinatura Flexible Sync.
3

Sem fazer nenhuma alteração no código, você pode executar a aplicação tanto em um simulador iOS quanto em um dispositivo físico.

Execute a aplicação, registre uma nova conta de usuário e, em seguida, adicione um novo item à sua lista de tarefas.

4

Faça login no Atlas App Services. Na aba Data Services , clique em Browse Collections. Na lista de bancos de dados, localize e expanda o banco de dados do todo e então a coleção do Item . Você deve ver o documento que criou nesta coleção.

1

Agora que você confirmou que tudo está funcionando como o esperado, podemos adicionar alterações. Neste tutorial, decidimos que queremos adicionar uma propriedade "priority" a cada Item para que possamos filtrar os Itens por suas prioridades. A propriedade de prioridade utiliza um enum PriorityLevel para restringir os valores possíveis.

Para fazer isso, siga estas etapas:

  1. Abra o App.xcodeproj no Xcode.

  2. Abra o arquivo de classe Item.swift.

  3. Adicione a seguinte propriedade à classe Item:

    @Persisted var priority: PriorityLevel
  4. Adicione também um PriorityLevel PersistableEnum abaixo da classe 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 é o protocolo que marca os tipos de enum como persistíveis diretamente no Realm. Definimos o tipo do enum como Int aqui em vez de String para que possamos consultar com base em um nível de prioridade numérica mais tarde. Usamos uma propriedade computada description para exibir uma representação em string da prioridade na interface do usuário.

2
  1. No diretório Views, vá para CreateItemView.swift. Adicione uma nova propriedade @State sob a propriedade itemSummary existente. Por enquanto, defina o valor padrão como prioridade média:

    @State var itemSummary = ""
    @State var priority = PriorityLevel.medium
  2. Agora, no corpo Form, adicione um seletor que permita ao usuário escolher qual nível de prioridade definir no novo item. Localize o Section que contém os botões e insira o seguinte código acima dele:

    Section(header: Text("Priority")) {
    Picker(selection: $priority, label: Text("Set priority")) {
    ForEach(PriorityLevel.allCases, id: \.self) { priority in
    Text(priority.description)
    }
    }
    }
  3. Agora, vá até o Button(action: que define os valores de newItem quando o usuário pressiona o botão Save. Adicione uma linha abaixo de newItem.summary para definir também a propriedade priority:

    newItem.summary = itemSummary
    newItem.priority = priority
3

Nesse ponto, você pode executar o aplicativo novamente. Faça login usando a conta que você criou neste tutorial. Você verá o único item que criou anteriormente. Adicione um novo item e você verá que agora pode definir a prioridade. Escolha High para a prioridade e salve o item.

Agora volte para a página de dados do Atlas em seu navegador e atualize a coleção do Item. Você deve agora visualizar o novo Item com o campo priority adicionado e configurado para 1. O item existente não tem um campo priority.

Dois itens em uma coleção

Observação

Por que isso não interrompeu a sincronização?

A adição de uma propriedade a um objeto Realm não é uma alteração de ruptura e, portanto, não exige uma reinicialização do cliente. O aplicativo de modelo tem o Modo de Desenvolvimento habilitado, portanto, as alterações no objeto Realm do cliente são refletidas no esquema do lado do servidor. Para obter mais informações, consulte Modo de desenvolvimento e Atualizar seu modelo de dados.

1

No arquivo ContentView.swift, criamos a inscrição da Sincronização Flexível que define quais documentos sincronizamos com o dispositivo e a conta do usuário. Procure a variável let config = user.flexibleSyncConfiguration(initialSubscriptions: onde definimos as assinaturas iniciais. No método subscriptions.append(), você pode ver que, no momento, estamos assinando todos os documentos em que a propriedade owner_id corresponde ao ID do usuário autenticado. Queremos manter isso, mas sincronizar apenas os itens marcados como de prioridade Alta ou Grave.

É por isso que definimos o enum PriorityLevel para o tipo Int, em que a prioridade mais alta (grave) tem valor 0 e a prioridade mais baixa (baixa) tem valor 3. Podemos fazer comparações diretas entre um Int e a propriedade priority. Para fazer isso, atualize a instrução de consulta para incluir documentos em que a prioridade é igual ou menor que PriorityLevel.High (ou 1), conforme mostrado aqui.

Também adicionaremos o conjunto reRunOnOpen e o definiremos como true para forçar a consulta de assinatura a recalcular quais documentos sincronizar toda vez que abrirmos o aplicativo.

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

Execute o aplicativo novamente. Faça login usando a conta que você criou neste tutorial. Como adicionamos reRunOnOpen, o aplicativo deve sincronizar novamente apenas os documentos que correspondem à query de Sincronização flexível. Após um momento inicial em que a Realm ressincroniza a coleção de documentos, você verá apenas o novo item de alta prioridade que você criou.

O documento de item que você criou inicialmente não está sincronizado, pois não tem um campo priority. Se você quiser que este Item seja sincronizado, você pode editar o documento na interface do usuário Atlas e adicionar um valor para o campo prioritário.

Se quiser testar ainda mais a funcionalidade, crie Itens de várias prioridades. Você verá um novo item com uma prioridade mais baixa aparecer brevemente na lista de itens e depois desaparecer. O manipulador de erros de sincronização fornece uma mensagem que descreve esse comportamento:

ERROR
"Client attempted a write that is outside
of permissions or query filters; it has been reverted"

Você também pode ver esta mensagem no registro do console.

Nesse cenário, o Realm cria o item localmente, sincroniza-o com o backend e, em seguida, reverte a escrita porque ele não atende às regras de assinatura.

Adicionar uma propriedade a um objeto de Realm existente não é uma alteração significativa, e o modo de desenvolvimento garante que a alteração de esquema se reflita no lado do servidor.

Observação

Compartilhar feedback

Como foi? Use a aba Compartilhar feedback no canto inferior direito da página para nos informar se esse tutorial foi útil ou se você teve algum problema.

← Tutorial: Atlas Device Sync para React Native