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

Tutorial: Atlas Device Sync para React Native

Nesta página

  • Pré-requisitos
  • Comece com o Aplicativo Modelo
  • Configurar o Aplicativo Modelo
  • Instalar dependências
  • Construa o Aplicativo
  • Teste o Aplicativo
  • Familiarize-se com o Aplicativo Modelo
  • Atlas App Services App
  • Aplicativo React Native
  • Adicionar um Campo de Nível de Prioridade
  • Definir os níveis de prioridade
  • Atualize o modelo de dados do Item
  • Adicione um seletor de prioridade
  • Executar e Testar o Aplicativo
  • Atualizar a assinatura de sincronização
  • Adicionar uma Alternância de Modo à UI do Usuário
  • Atualizar a assinatura de sincronização
  • Teste o Aplicativo
  • O que vem a seguir?

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

Você pode usar o Realm React Native SDK do React e @ Realm/React para criar um aplicação móvel com o React Native. Este tutorial mostra como construir seu próprio aplicativo que usa o Flexible Sync.

Para este tutorial, começaremos com um aplicativo de modelo TypeScript criado previamente para ver como tudo se encaixa.

A aplicação é um modelo pré-criado que inclui uma aplicação React Native (frontend) e seus arquivos de configuração do aplicativo App Services correspondentes (backend).

O aplicativo modelo é um aplicativo básico de lista de tarefas que permite que os usuários façam várias coisas para gerenciar suas tarefas:

  • Crie contas de e-mail/senha e faça login e logout do aplicativo.

  • Crie, leia, atualize e exclua suas próprias tarefas.

  • Visualizar todas as tarefas, mesmo que o usuário não seja o proprietário.

Após executar o aplicativo de modelo, você adicionará um novo campo priority no modelo Item existente e atualizará a assinatura Sincronização flexível para somente mostrar itens dentro de uma série de prioridades. Este exemplo ilustra como você pode adaptar o aplicativo de modelo para suas próprias necessidades. Você não faria necessariamente esta alteração dada a estrutura atual do aplicativo modelo.

O modelo de aplicativo oferece uma alternância que simula o dispositivo no modo . Esse botão permite que você teste rapidamente a funcionalidade Device Sync, emulando o usuário sem conexão com a Internet. No entanto, você provavelmente removeria essa alternância em um aplicativo de produção.

Observação

Confira o início rápido

Se você preferir explorar por conta própria em vez de seguir um tutorial guiado, confira o Início Rápido do React Native. Ele inclui exemplos de código copiáveis e as informações essenciais que você precisa para configurar um aplicativo React Native com o Atlas Device Sync.

  • Você deve configurar seu ambiente local para o desenvolvimento do React Native antes de iniciar este tutorial. Para obter instruções detalhadas, consulte Configurar o ambiente de desenvolvimento na documentação do React Native.

  • 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 é baseado no aplicativo de modelo de sincronização flexível React Native SDK denominado react-native.todo.flex. Começamos com o aplicativo padrão e construímos novas funcionalidades 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 JavaScript (React Native).

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 React Native 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 react-native.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 React Native está disponível em https://github.com/mongodb/template-app-react-native-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.

Use as etapas a seguir para colocar o aplicativo de modelo em funcionamento no seu computador:

1

No seu terminal, acesse o diretório que contém o código do cliente. Se você criou o aplicativo com App Services CLI, acesse MyTutorialApp/react-native.todo.flex. Caso contrário, vá para a raiz do seu projeto baixado ou clonado. Em seguida, execute os seguintes comandos para navegar para instalar as dependências do aplicativo:

npm install

Para construir e executar o aplicativo em um dispositivo iOS ou simulador, instale as dependências adicionais do iOS com CocoaPods.

cd ios
npx pod-install
2

Neste ponto, você deve ter um aplicativo React Native totalmente funcional que possa ser executado em iOS, Android ou ambos.

Se você encontrar um erro ou tiver problemas, certifique-se de que seu ambiente React Native esteja configurado corretamente. Consulte a configuração oficial do React Native ambiente de desenvolvimento do guia. Siga todas as etapas para seu sistema operacional de desenvolvimento e sistema operacional de destino.

Para garantir que tudo funcione no iOS, crie o build do aplicativo e execute-o em um simulador do iOS:

npm run ios

Para garantir que tudo funcione no Android:

  1. Inicie um emulador de Android. Consulte Execute aplicativos no emulador de Android para obter mais informações.

  2. Crie o aplicativo no emulador:

    npm run android

    Um erro comum é Error: spawn ./gradlew EACCES. Isso significa que as permissões do arquivo de projeto não estão corretas. No MacOS, você pode corrigir isso inserindo chmod 755 android/gradlew no terminal.

3

Quando a construção for concluída, você deverá ter um aplicativo funcional em execução no simulador. No aplicativo, registre uma nova conta e teste os recursos:

  • Adicione alguns itens de tarefas à lista.

  • Pressione a caixa de seleção em um ou dois itens para marcá-los como concluídos.

  • Pressione o X em um item para excluí-lo da lista.

  • Alterne a conectividade com a Internet na aplicação para simular o modo offline.

Se você conectar ao seu Cluster do Atlas e consultar a collection todo.Item, poderá ver os dados do seu aplicativo. Enquanto o aplicativo React Native não estiver no modo off-line, novos dados e alterações no aplicativo serão sincronizados automaticamente com a collection todo.Item.

Dica

Para saber como se conectar ao Atlas Cluster, consulte Conectar-se a um cluster.

Da mesma forma, todas as alterações na coleção sincronizam automaticamente com o aplicativo React Native. Tente alterar o status de conclusão de um item em seu cluster. O aplicativo React Native será atualizado automaticamente com o novo valor sempre que houver uma conexão de rede disponível.

Dica

Para saber mais sobre como atualizar dados em seu cluster, consulte Atualizar documentos.

Agora que você tem o aplicativo modelo em execução, vamos analisar o código para ver com o que estamos trabalhando.

O aplicativo de modelo inclui um Aplicativo de Serviços de Aplicativo completamente configurado no diretório backend. Ele tem um valor appId exclusivo em atlasConfig.json que os aplicativos clientes usam para se conectar.

Também inclui as seguintes configurações pré-definidas:

  • Uma fonte de dados vinculada ao seu Atlas Cluster.

  • Um modelo de dados para a coleção todo.Item que corresponde à classe Item no aplicativo React Native.

  • Um fornecedor de autenticação que permite que os usuários se registrem e façam login no seu aplicativo com um e-mail e uma senha.

  • Uma configuração de sincronização flexível com uma única função de sessão que permite aos usuários ler e escrever seus próprios itens e ver os itens de outros usuários.

A aplicação React Native é um cliente móvel totalmente configurado que pode ser executado nos dispositivos iOS e Android.

O aplicativo usa a biblioteca @realm/react. A biblioteca inclui ganchos e componentes do React que simplificam o trabalho com o back-end do Atlas e o banco de dados Realm.

O aplicativo contém alguns arquivos e diretórios de configuração, mas você pode ignorá-los, a menos que queira personalizar o aplicativo. Para este tutorial, você deve estar familiarizado com os componentes React no diretório source/ :

Nome do Arquivo
Descrição
ItemSchema.tsx
A classe Item, incluindo seu modelo de dados de objeto. Importamos esta classe em AppWrapper.tsx para incluí-la no Realm esquema geral do aplicativo.
AppWrapper.tsx
Este é o componente raiz do aplicativo. Ele funciona como um componente wrapper e contém todos os fornecedores @realm/react. É aqui que você configura seu domínio e sua conexão com o backend do Atlas.
App.tsx
A maior parte da funcionalidade do aplicativo está contida neste componente e em seus derivados. Como os provedores @realm/react são agrupados em torno desse componente, ele pode acessar uma instância do backend do Atlas, objetos de usuário e interagir com o banco de dados Realm.
WelcomeView.tsx
O formulário de registro e o login de usuário que os usuários veem quando abrem o aplicativo pela primeira vez.
ItemListView.tsx
A principal aplicação de lista de tarefas com a qual os utilizadores interagem depois de iniciarem sessão. Ele faz a busca por Item Objetos de Realm e os exibe em uma lista. Inclui também o código para criar novos objetos Item e armazená-los no Realm.
CreateToDoPrompt.tsx
Um formulário de UI de usuário que nos permite inserir dados para novos objetos Item. O código que realmente cria novos objetos está em ItemListView.tsx.
LogoutButton.tsx
Um botão reutilizável que desconecta um usuário autenticado.
OfflineModeButton.tsx
Um botão reutilizável que simula um modo offline pausando e retomando o Realm syncSession atual.

Agora que você está mais familiarizado com o que já é disponibilizado no aplicativo de modelo , vamos escrever algum código para implementar um novo recurso.

Para este tutorial, adicionaremos uma nova propriedade priority aos objetos Item. Isso nos permitirá organizar as tarefas por importância e nos concentrarmos somente nas mais importantes.

1

Queremos permitir um pequeno número de níveis de prioridade nomeados e queremos poder classificar os níveis com facilidade Para fazer isto, usaremos uma função auxiliar para definir um objeto enum que mapeia um conjunto de nomes de nível ordenados de e para um inteiro que representa sua prioridade.

Adicione o seguinte código diretamente nas declarações de importação em source/ItemSchema.tsx:

function createEnum(arr) {
arr.forEach((p, i) => arr[p] = i);
return arr;
}
// Priority.High === 1
// Priority[Priority.High] === "High"
export const Priority = createEnum([
"Severe",
"High",
"Medium",
"Low",
])

Os níveis de prioridade no enum são ordenados do mais importante para o menos importante. O valor do índice correspondente para cada nível aumenta do mais importante, Priority[0], para o menos importante, Priority[3]. Isso significa que uma prioridade mais alta (ou seja, mais importante) tem um valor de índice menor.

2

Agora temos um enum que define os valores possíveis do campo priority . Entretanto, ainda temos que definir o campo priority na classe Item .

Adicione as seguintes linhas ao seu código em source/ItemSchema.tsx para adicionar priority ao modelo de dados Item:

source/ItemSchema.tsx
export class Item extends Realm.Object<Item> {
_id!: BSON.ObjectId;
isComplete!: boolean;
summary!: string;
owner_id!: string;
priority!: string;
static schema: Realm.ObjectSchema = {
name: 'Item',
primaryKey: '_id',
properties: {
// This allows us to automatically generate a unique _id for each Item
_id: {type: 'objectId', default: () => new BSON.ObjectId()},
// All todo items will default to incomplete
isComplete: {type: 'bool', default: false},
summary: 'string',
owner_id: 'string',
priority: {
// Store the index value of the Priority enum rather than the name
type: 'int',
default: Priority.High
},
},
};
}

Observação

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

Nesse ponto, seu modelo React Native Item e o esquema correspondente em seu Aplicativo App Services não estão mais de acordo. Tudo bem!

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.

3

O modelo de dados do seu aplicativo agora inclui um priority para cada objeto Item . Vamos atualizar a UI do usuário do aplicativo para que você possa escolher um valor de priority ao adicionar uma nova tarefa à lista.

Primeiro, instalaremos uma biblioteca externa para implementar o componente prioritário. Execute o seguinte no seu terminal dentro da raiz do seu projeto:

npm install @react-native-picker/picker

Se você estiver criando para iOS, vincule os Cocoapods associados depois de instalar o pacote:

npx pod-install

Dica

Talvez seja necessário reconstruir seu aplicativo após a instalação. Para fazer isso, interrompa o empacotador do seu projeto e execute o comando build:

npm run ios
npm run android

Agora que o pacote está totalmente instalado, vamos atualizar o novo Componente de prompt de criação de tarefas para usar o seletor.

Adicione as seguintes importações ao topo de source/CreateToDoPrompt.tsx:

import {Picker} from '@react-native-picker/picker';
import {Priority} from './ItemSchema';

Em seguida, modifique o componente CreateToDoPrompt:

  • Adicionar priority à definição de props onSubmit()

  • Acompanhe priority em um hook de estado

  • Conecte o estado ao componente Picker que você importou

  • Passe priority para o manipulador onSubmit()

fonte/CreateToDoPrompt.tsx
type Props = {
onSubmit(args: {summary: string; priority: string;}): void;
};
export function CreateToDoPrompt(props: Props): React.ReactElement<Props> {
const {onSubmit} = props;
const [summary, setSummary] = useState('');
const [priority, setPriority] = useState(Priority.High);
return (
<View style={styles.modalWrapper}>
<Text h4 style={styles.addItemTitle}>
Add To-Do Item
</Text>
<Input
placeholder="What do you want to do?"
onChangeText={(text: string) => setSummary(text)}
autoCompleteType={undefined}
/>
<Picker
style={{width: '80%'}}
selectedValue={priority}
onValueChange={value => setPriority(value)}>
{Priority.map(priority => (
<Picker.Item
key={priority}
label={priority}
value={Priority[priority]}
/>
))}
</Picker>
<Button
title="Save"
buttonStyle={styles.saveButton}
onPress={() => onSubmit({summary, priority})}
/>
</View>
);
}

No source/ItemListView.tsx, modifique a função createItem() para aceitar e utilizar o priority:

source/ItemListView.tsx
const createItem = useCallback(
({summary, priority}: {summary: string, priority: string}) => {
realm.write(() => {
return new Item(realm, {
summary,
owner_id: user?.id,
priority
});
});
},
[realm, user],
);

Em seguida, modifique o manipulador de criação de envio de tarefas para aceitar o nível priority e passá-lo para createItem():

source/ItemListView.tsx
<CreateToDoPrompt
onSubmit={({summary, priority}) => {
setShowNewItemOverlay(false);
createItem({summary, priority});
}}
/>

Finalmente, modifique o modelo do item da lista para renderizar as tarefas priority antes do summary:

source/ItemListView.tsx
<ListItem
key={`${item._id}`}
bottomDivider
topDivider
hasTVPreferredFocus={undefined}
tvParallaxProperties={undefined}>
<Text>{item.priority}</Text>
<ListItem.Title style={styles.itemTitle}>
{item.summary}
</ListItem.Title>
<ListItem.Subtitle style={styles.itemSubtitle}>
{item.owner_id === user?.id ? '(mine)' : ''}
</ListItem.Subtitle>
<ListItem.CheckBox
checked={item.isComplete}
checkedColor={COLORS.primary}
iconType="material"
checkedIcon="check-box"
uncheckedIcon="check-box-outline-blank"
onPress={() => toggleItemIsComplete(item._id)}
/>
<Button
type="clear"
onPress={() => deleteItem(item._id)}
icon={
<Icon
type="material"
name="clear"
size={12}
color="#979797"
tvParallaxProperties={undefined}
/>
}
/>
</ListItem>
4

Seu aplicativo agora deve permitir que os usuários definam um priority para novos itens de tarefas.

Reconstrua e abra o aplicativo. Adicione alguns novos itens a fazer para confirmar que você pode escolher um nível de prioridade e que a lista exibe a prioridade de cada item a fazer.

O protocolo Device Sync usa um modelo flexível em que cada cliente de sincronização usa uma query RQL padrão para escolher um subconjunto de dados do aplicativo e, em seguida, assina o subconjunto. Isso extrai automaticamente a versão mais recente de todos os dados no subconjunto para o dispositivo e sincroniza as alterações nos dados entre dispositivos.

Por exemplo, o aplicativo modelo que você está utilizando tem a seguinte inscrição embutida para itens que o usuário atual possui:

source/ItemListView.tsx
realm.subscriptions.update(mutableSubs => {
mutableSubs.removeByName(itemSubscriptionName);
mutableSubs.add(
realm.objects(Item).filtered(`owner_id == "${user?.id}"`),
{name: ownItemsSubscriptionName},
);
});

Você pode personalizar a assinatura durante o tempo de execução para sincronizar somente os dados de que o aplicativo precisa. Vamos adicionar um recurso para demonstrar como fazer isso.

Para este tutorial, adicionaremos um botão que nos permite alternar entre dois modos: um onde o aplicativo sincroniza todos os itens pendentes e outro onde ele só sincroniza itens importantes com um priority de Alto ou Severo.

1

Primeiro, adicione um hook useState() ao componente ItemListView para acompanhar o modo atual:

ItemListView.tsx
const [showImportantOnly, setShowImportantOnly] = useState(false);

Em seguida, adicione um novo botão que alterna o modo para a parte inferior da lista de tarefas, depois de <ListItem>:

source/ItemListView.tsx
<Button
title={showImportantOnly ? 'Show All' : 'Show Important Only'}
buttonStyle={{
...styles.addToDoButton,
backgroundColor: showImportantOnly ? '#00A35C' : '#FFC010',
}}
onPress={() => setShowImportantOnly(showImportantOnly => !showImportantOnly)}
/>
2

Neste ponto, o aplicativo pode alternar modos na interface do usuário, mas não fizemos mais nada, então os modos são funcionalmente idênticos. Vamos atualizar a assinatura de sincronização para sincronizar somente os dados relevantes para o modo atual.

No primeiro useEffect do componente ItemListView, adicione o código que verifica o modo atual e acrescenta um filtro priority adicional à query se o modo showImportantOnly estiver ativo:

source/ItemListView.tsx
useEffect(() => {
if (showAllItems) {
realm.subscriptions.update(mutableSubs => {
mutableSubs.removeByName(ownItemsSubscriptionName);
mutableSubs.add(realm.objects(Item), {name: itemSubscriptionName});
});
} else if (showImportantOnly) {
realm.subscriptions.update(mutableSubs => {
mutableSubs.removeByName(itemSubscriptionName);
mutableSubs.add(
realm.objects(Item).filtered(`owner_id == "${user?.id}" && priority <= 1`),
{name: ownItemsSubscriptionName},
);
});
} else {
realm.subscriptions.update(mutableSubs => {
mutableSubs.removeByName(itemSubscriptionName);
mutableSubs.add(
realm.objects(Item).filtered(`owner_id == "${user?.id}"`),
{name: ownItemsSubscriptionName},
);
});
}
}, [realm, user, showAllItems, showImportantOnly]);

Importante

Não se esqueça de adicionar showImportantOnly à lista de dependências no segundo argumento de useEffect.

3

Seu aplicativo agora está configurado para modificar sua assinatura de sincronização com base no modo atual.

Reconstrua e execute o aplicativo para garantir que tudo funcione. Você deve ser capaz de criar, concluir e excluir itens de tarefas, bem como alternar entre a visualização de todos os itens e apenas dos itens importantes.

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.

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?