Página inicial do Docs → Serviç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.
Objetivos de aprendizagem
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.
Pré-requisitos
Certifique-se de ter o software necessário instalado. O Swift SDK exige Xcode versão 13.1 ou mais recente.
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.
Comece com o Modelo
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.
Explore o aplicativo Template
Abra o aplicativo
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.
Explore a estrutura do aplicativo
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 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 |
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. |
Verificar o Backend
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.
Modificar a Aplicação
Adicionar uma nova propriedade
Adicionar uma propriedade ao modelo
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:
Abra o
App.xcodeproj
no Xcode.Abra o arquivo de classe
Item.swift
.Adicione a seguinte propriedade à classe
Item
:var priority: PriorityLevel Adicione também um PriorityLevel
PersistableEnum
abaixo da classeItem
:class Item: Object, ObjectKeyIdentifiable { true) var _id: ObjectId (primaryKey: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 é o protocolo que marca os tipos de enum como persistíveis diretamente no Realm. Definimos o tipo do enum como
Int
aqui em vez deString
para que possamos consultar com base em um nível de prioridade numérica mais tarde. Usamos uma propriedade computadadescription
para exibir uma representação em string da prioridade na interface do usuário.
Definir a prioridade ao criar um novo item
No diretório
Views
, vá paraCreateItemView.swift
. Adicione uma nova propriedade@State
sob a propriedadeitemSummary
existente. Por enquanto, defina o valor padrão como prioridade média:var itemSummary = "" var priority = PriorityLevel.medium Agora, no corpo
Form
, adicione um seletor que permita ao usuário escolher qual nível de prioridade definir no novo item. Localize oSection
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) } } } Agora, vá até o
Button(action:
que define os valores denewItem
quando o usuário pressiona o botãoSave
. Adicione uma linha abaixo denewItem.summary
para definir também a propriedadepriority
:newItem.summary = itemSummary newItem.priority = priority
Executar e testar
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
.
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.
Alterar a assinatura
Atualizar a assinatura
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)
Executar e testar
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.
Conclusão
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.
O que vem a seguir?
Considere adicionar a nova propriedade
Priority
às visualizaçõesItemList
,ItemRow
eItemDetail
.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 projetos deengenharia e exemplos fornecidos por especialistas.
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.