Para melhor compreensão do aplicativo do Meu RH, será feito um breve conceito do que é Aplicativo Nativo, Aplicativo Híbrido, IONIC, IONIC CLI, Capacitor, CAPACITOR CLI e Gradle. O que é um aplicativo nativo?Aplicativo nativo é desenvolvido na linguagem exclusiva do determinado sistema operacional (Android ou IOS), explorando todas as potencialidades daquele sistema. Como é desenvolvido com linguagens nativas, o desenvolvedor consegue integrar com funcionalidades nativas (GPS, Câmera, etc.) com uma maior abrangência e customização das bibliotecas do dispositivo. Para Android é desenvolvido com Java ou Kotlin e para o IOS com Swift. O que é um aplicativo híbrido?Aplicativo hibrido é desenvolvido em uma única linguagem ou framework, possuindo acesso a camadas nativas dos aparelhos e sendo possível o funcionamento em ambos sistemas operacionais com o mesmo código. É comum que ele seja desenvolvido com HTML, CSS e Javascript e o Framework envolvido, pois em tempo de build o mesmo realiza a conversão para a linguagem nativa do sistema operacional em que ele será reproduzido. O que é o IONIC?IONIC é um framework para desenvolvimento híbrido, que abstrai as camadas nativas dos sistemas operacionais, disponibilizando um kit de UI com código aberto para desenvolver aplicativos móveis de alto desempenho ou somente WEB. Nele é possível utilizar frameworks e bibliotecas Javascripts, como Angular, Vue e React. O IONIC disponibiliza um kit de componentes para interação da interface com o usuário (Ui Components), unindo a ele a tematização destes componentes. A imagem abaixo ilustra de forma abstrata, qual a responsabilidade do IONIC durante o seu desenvolvimento com uma tecnologia WEB: 
Para a comunicação com funcionalidades nativas do dispositivo o IONIC, o mesmo sugere o Capacitor como intermediador. IONIC CLIIONIC CLI é a Interface de linha de comando do IONIC, qualquer funcionalidade que você tenha que utilizar do mesmo, como build, subir localmente o aplicativo, informações do aplicativo e versionamento será por ele. É uma ferramenta que abstrai a complexidade dos comandos para uma interface em linha de comando. Abaixo é possível ver suas funcionalidades: 
O que é o Capacitor?Projeto de código aberto que executa aplicativos WEB modernos nativamente em IOS e Android. Capacitor além de otimizar a implantação de softwares com tecnologia WEB nos aplicativos móveis de forma nativa, o mesmo fornece plug-ins que possuem acesso aos recursos nativos do determinado dispositivo, como câmera, localização, biometria e etc. O mesmo possui plug-ins oficiais e também da própria comunidade na qual a empresa não se responsabiliza, mas realiza a indicação. 
Na imagem acima, é possível compreender que o WEB APP é criado por uma tecnologia WEB (Angular, React ou Vue) na qual está dentro do ambiente do IONIC Framework. Logo o capacitor fornece API’S, em formato de plug-ins (dependências) que consegue abstrair e disponibilizar informações/funções da camada nativa do dispositivo. E está abstração é fornecida em tempo de execução. Abaixo está a lista dos plug-ins utilizados no Meu RH e uma breve explicação de seu uso no aplicativo: Plugin | Funcionalidade | Origem |
---|
capacitor-native-settings | Acessar as configurações do dispositivo. | Oficial | capacitor-plugin-webview-cache | Apagar cache da webview. | Oficial | capacitor-root-jailbreak-detector | Identifica permissões de Root ou Jailbreak no dispositivo. | Usuário do github | aparajita/capacitor-biometric-auth | Obtem o recurso de biometria. | Usuário do github | awesome-cordova-plugins/chooser | Recurso de transferência de arquivo. | Oficial | awesome-cordova-plugins/in-app-browser | Abrir um site web no dispositivo. | Oficial | capacitor-community/file-opener | Abrir arquivos no dispositivo. | Comunidade | capacitor-community/native-market | Redirecionar o aplicativo para lojas GooglePlay e AppleStore. | Comunidade | capacitor-firebase/messaging | Mensageiro de notificações push no dispositivo. | Comunidade | capacitor-mlkit/barcode-scanning | Escaneador de QR Code. | Usuário do github | capacitor/app-launcher | Acessar um aplicativo das lojas GooglePlay e AppleStore pelo Meu RH. | Oficial | capacitor/camera | Obtêm o recurso de câmera. | Oficial | capacitor/filesystem | Recursos para uso de arquivos no aplicativo. | Oficial | capacitor/geolocation | Obtêm o recurso da localização. | Oficial | capacitor/keyboard | Obtêm recursos do teclado do dispositivo. | Oficial | capacitor/network | Obtêm recursos da internet do dispositivo. | Oficial | capacitor/preferences | Banco de dados para armazenamento de informações do aplicativo. | Oficial | capacitor/push-notifications | Obtêm informações para o Push Notification. | Oficial | capacitor/share | Compartilhamento de arquivos do aplicativo para o dispositivo. | Oficial | capacitor/splash-screen | Acessa funcionalidades da splash-screen do aplicativo. | Oficial | capacitor/status-bar | Acessa funcionalidades da barra superior do dispositivo. | Oficial | cordova-plugin-nativestorage | Banco de dados para armazenamento de informações do aplicativo. | Oficial | cordova-sqlite-storage | Banco de dados para armazenamento de informações do aplicativo. | Oficial | localforage-cordovasqlitedriver | Driver para uso do SQLite no Capacitor. | Oficial |
O que é o CAPACITOR CLI?Ferramenta de interface de linha de comando, responsável por fornecer funções que auxiliarem no seu desenvolvimento com o Capacitor. Todo o comando feito por ela sempre será iniciado com ionic e ao lado a abreviação do Capacitor cap, exemplo: ionic cap build. Segue abaixo alguns comandos que serão utilizados durante o desenvolvimento: ionic cap sync: Sincroniza as alterações feitas do projeto IONIC com o Capacitor, como inserção, modificação ou exclusão de permissões e plug-ins. Em cada alteração citada, será obrigatório realizar o sincronismo neste comando e checar o log para validação de alguma inconsistência na configuração do projeto. ionic cap build <plataforma>: Realiza o build do projeto, verificando se o código compilado está coerente e abrirá a IDE (Android Studio ou XCode) para utilização do aplicativo compilado. ionic cap run: Irá executar o aplicativo em qualquer plataforma disponibilizada, como emulador ou dispositivo físico. ionic cap update <plataforma>: Um sucessor do sync para atualização dos plug-ins e dependências que foram alteradas/modificadas no package.json do projeto. O que é Gradle?É uma ferramenta utilizada pelo Capacitor de forma padrão, para trazer maior velocidade e flexibilidade na automação de construção e empacotamento do código do aplicativo. É responsável por compilar todo o código do projeto (IONIC e plug-ins do Capacitor) e gerar um único executável, sendo da extensão. apk ou .aab. Sendo usado somente em projetos Android, ele engloba toda a configuração do dispositivo nativo, desde permissões, inserção de dependências, configuração de versionamento e assinatura do aplicativo para colocar o mesmo na PlayStore. Estrutura de pastas e arquivos do gradle: 
Seguindo a partir da raiz da pasta android, nós temos os arquivos/pastas e suas responsabilidades: .gradle, build, capacitor-cordova-android-plugins: São pastas geradas a partir do build do gradle, responsáveis por guardar informações temporárias, hashs dos plug-ins. gradle.properties: responsável por guardar variáveis de configuração da aplicação Android, como informações e senhas para a assinatura do aplicativo antes de inserir o aplicativo na loja. variables.gradle: responsável por guaradar variáveis de versionamento dos SDK do Android. app/build: está pasta guardará o arquivo compilado do build do Gradle (sendo .apk ou .aab). Importante sempre excluir ela antes gerar um novo arquivo compilado para evitar problemas com cache. app/build.gradle: guardará informações como versionamento do aplicativo, identificador único e configurações para compilação debug ou release. app/google-services.json: arquivo de configuração do push notification. app/src/main/res: ícones que será utilizado no dispositivo a partir do tamanho do dispositivo. app/src/main/AndroidManifest.xml: Arquivo responsável por toda a configuração de permissão e customização de ícones ou plug-ins.
Arquitetura do aplicativo Meu RHPara a construção do nosso aplicativo utilizamos o framework de desenvolvimento IONIC na versão 7 e Angular na versão 15. A parte de comunicação para comunicar com recursos nativos é feita pelo Capacitor. O projeto está localizado no repositório MeuRH no AzureDevops. O aplicativo hoje contempla com as telas de: Autenticação: Login, Esqueceu a Senha, Alterar a senha e Home. Configurações: Configuração de ambiente, Visualização/Compartilhamento de QR-Code e telas de ajuda. Todas as outras funcionalidades do Meu RH são renderizadas pelo projeto de Portais através de um browser que é aberto dentro do aplicativo. Como utilizamos a biblioteca do PO-UI no projeto de Portais e ela é totalmente responsiva, se adaptando ao tamanho do dispositivo mobile. 
Porém ao abrir o browser, ficamos com duas Webviews diferentes (A própria do IONIC e a outra do browser). Quem acessa os recursos do celular é a própria Webview do IONIC ou o Capacitor e por isso o browser onde o portal acessa não tem acesso direto a esses recursos. Porém, sabemos que dentro do aplicativo consumimos esses recursos da mesma forma (Ex: Batida por geolocalização). Para isso funcionar, criamos uma espécie de fila de eventos entre as duas webviews, sendo que sempre quando o portal precisa de algum recurso do celular ele posta uma mensagem na fila de eventos (onde a Webview do IONIC está sempre escutando), o IONIC solicita o recurso/ação e devolve uma mensagem de resposta para a Webview do portal:

Foi criado um contrato de mensagem nos dois projetos para que os dois lados possam saber o que está sendo solicitado e o que deve ser retornado: Projeto de portais solicitando geolocalização: 
Projeto do app recebendo a solicitação e verificando qual o evento recebido: 
Utiliza o plugin do Capacitor para recuperar a geolocalização e emite a resposta na fila de eventos para o portal: 
Projeto de portais recebendo a resposta do IONIC. Seta a informação de geolocalização e exibe a localização no mapa renderizado na tela: 
Em relação a comunicação com o backend, o formato se assemelha a versão de Portal do Meu RH, inclusive a parte que ele renderiza o portal pelo browser utiliza todo o mecanismo do projeto de Portais. Porém, algumas API's estão também do lado do IONIC, por exemplo a API de autenticação. Dessa forma, temos um serviço genérico que é capaz de identificar qual o ERP e a partir disso definir qual a url base para realizar as requisições para o backend. A diferença é que agora todas as requisições provenientes do IONIC exigem o mecanismo de CORS (melhor detalhado na sessão de CORS). Dentre as três linhas de produto temos dois tipos de mecanismos, para RM e Protheus utilizamos um Bearer Token e em Datasul utilizamos Basic Authentication (Cookies). Em ambos os mecanismos os objetos de autenticação são compartilhados entre as duas webviews, visto que são necessários nos dois lados:

Link do repasse sobre os tópicos acima: https://drive.google.com/file/d/15UOFr5KBxQQXdhuClExyS6dyWO42bbtu/view?usp=sharing
|