Menu Docs
Página inicial do Docs
/ /
Serviços Atlas App

Tutorial: Atlas Device Sync para Swift com a Swift IU

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 aplicação em vez de seguir um tutorial guiado, confira o Início Rápido do Swift. Ele inclui exemplos de código copiáveis e as informações essenciais necessárias para configurar um backend do Atlas App Services .

Para uma experiência inicial específica do SwiftUI, consulte o Realm com o SwiftUI QuickStart.

  • Este tutorial começa com um aplicativo de modelo. Você precisa de uma conta do Atlas, de uma chave de API e do App Services CLI 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 do Atlas para a conta do MongoDB Cloud com a qual deseja se conectar. Você deve ser proprietário do projeto para criar um aplicativo modelo usando o App Services CLI.

    • Para saber mais sobre como instalar o App Services CLI, consulte Instalar o App Services CLI. 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.

Siga o procedimento descrito no guia Crie uma App Services App e selecione Create App from Template. Selecione o modelo Real-time Sync . Isso cria um App Services App pré-configurado para uso com um dos clientes da aplicação do modelo do Device Sync .

Após criar um aplicativo de modelo, a interface do usuário exibe um modal rotulado Get the Front-end Code for your Template. Esse modal fornece instruções para baixar o código do cliente do aplicativo modelo como um arquivo .zip ou usar a CLI do App Services para obter o cliente.

Após selecionar o método CLI do .zip ou App Services, siga as instruções na tela para obter o código do cliente. Para este tutorial, selecione o código de cliente SwiftUI (iOS + SwiftUI).

Observação

O utilitário ZIP padrão do Windows pode mostrar o arquivo .zip arquivo como vazio. Se você encontrar isso, use um dos programas de compactação de terceiros disponíveis.

O comando appservices apps create configura o backend e cria um aplicativo modelo SwiftUI para você usar como base para este tutorial.

Execute o seguinte comando em uma janela de terminal para criar um aplicativo chamado "MyTutorialApp" que é implantado na região US-VA com seu ambiente definido como "desenvolvimento" (em vez de produção ou controle de qualidade).

appservices app create \
--name MyTutorialApp \
--template swiftui.todo.flex \
--deployment-model global \
--environment development

O comando cria um novo diretório no caminho atual com o mesmo nome do valor do sinalizador --name.

Você pode bifurcar e clonar um repositório do Github que contenha o código do cliente Device Sync . O código do cliente SwiftUI está disponível em https://github.com/mongodb/template-app-swiftui-todo.

Se você usar esse processo para obter o código do cliente, deverá criar um aplicativo modelo para usar com o cliente. Siga as instruções em Crie um aplicativo modelo para usar a interface do usuário do Atlas App Services, o App Services CLI ou o Admin API para criar um aplicativo modelo do Device Sync.

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, deverá inserir manualmente a ID do Aplicativo de Serviços de Aplicativo no local apropriado em seu cliente. Siga as instruções do Configuration no cliente README.md para saber onde inserir sua 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

Conecte-se ao 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, em seguida, a coleção do Item. Você deverá 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 enumeração 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 IU.

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
clique para ampliar

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.

Dica

Alterando assinaturas com o modo de desenvolvedor ativado

Neste tutorial, quando você altera a assinatura e a query no campo de prioridade pela primeira vez, o campo é adicionado automaticamente ao Device Sync Collection Queryable Fields. Isso ocorre porque o aplicativo de modelo tem o Modo de Desenvolvimento habilitado por padrão. Se o Modo de Desenvolvimento não estivesse habilitado, você teria que adicionar manualmente o campo como um campo consultável para usá-lo em uma query de sincronização do lado do cliente.

Para obter mais informações, consulte Campos consultáveis.

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.

  • Considere adicionar a nova propriedade Priority às visualizações ItemList, ItemRow e ItemDetail.

  • Leia nossa documentação do Swift SDK e da SwiftUI.

  • Encontre postagens de blog orientadas para desenvolvedores e tutoriais de integração no MongoDB Developer Hub.

  • Participe do Fórum da MongoDB Community para aprender com outros desenvolvedores e especialistas técnicos do MongoDB.

  • Explore exemplos de projetos de engenharia fornecidos por especialistas.

Observação

Compartilhar feedback

Como foi? Use o widget Rate this page no canto inferior direito da página para avaliar sua eficácia. Ou registre um problema no repositório GitHub se você teve algum problema.

Próximo

O que são os Serviços de Aplicativo Atlas?