Projeto Integrador para obter o Certificado de Conclusão do curso de Desenvolvimento Mobile iOS/Swift pela Digital House em parceria com o Santander Mobile Coders.
Este projeto utiliza a API da Marvel como base. Dessa forma, a utilização deve estar em conformidade com os Termos de Uso dela.
- Tópicos
- Requerimentos
- Descrição
- Funcionalidades Previstas
- Imagens do Projeto
- Requisitos do Projeto
- Como Executar o Projeto
- Estrutura de Arquivos
- Padrões de Projeto
Para utilizar a aplicação é necessário atender os seguintes requisitos:
- Swift 5 ou superior
- Xcode 11.3 ou superior
- CocoaPods 1.10 ou superior
- macOS 10.14 (Mojave) ou superior
- RAM 8GB ou superior
- HD 128GB ou superior
Swift é uma linguagem de programação orientada a objetos, com tipagem forte e permite o desenvolvimento utilizado múltiplos paradigmas. Mais informações podem ser obtidas clicando no seguinte link Swift.
É uma Ferramenta de Desenvolvimento Integrado ou IDE na sigla em inglês. É a ferramenta sugerida pela Apple que é detentora da marca e da linguagem.
Mais informações, clique no link Xcode.
É um gerenciador de dependências para bibliotecas escritas em Objective-C e Swift. É um dos gerenciadores mais populares para Desenvolvimento iOS/Swift, se não, o mais popular.
Para obter mais informações a respeito do CocoaPods, basta clicar neste link: CocoaPods.
As bibliotecas utilizadas até o momento são:
- Firebase
- Alamofire
- Kingfisher
- SwiftyJSON
Firebase é um serviço Serverless para hospedagem de sites estáticos, banco de dados em tempo real, banco de dados offline, autenticação de usuários, entre outros. A empresa responsável pelo Firebase é o Google.
A biblioteca utiliza os serviços de autenticação de usuários e banco de dados Firestore.
Para obter mais informações, clique em pod Firebase.
São serviços do Google integrados ao Firebase e permitem monitorar o uso do aplicativo em tempo real, engajamento e aderência do público-alvo, além de acompanhar casos de falhas sistêmicas no dispositivo móvel.
É possível obter mais detalhes no indo clicando aqui.
Alamofire é uma biblioteca de requisições HTTP para iOS/Swift. É uma das mais utilizadas por desenvolvedores, pois facilita o gerenciamento de requisições HTTP, parsing de JSON, entre outros.
Acaso queira saber mais, clique em Alamofire.
KingFisher é uma biblioteca de carregamento de imagens, caching, entre outras funcionalidades para iOS/Swift.
Cliquem aqui para saber mais.
SwiftyJSON é uma biblioteca para serialização e desserialização Swift com foco em parsing de JSON.
Para obter mais informações, clique em SwiftyJSON.
É uma ferramenta de automação de testes, deploys, screenshots, entre outros. É uma das mais utilizadas para Desenvolvimento Mobile iOS e Android.
É ideal para projetos de médio e grande porte, já que permite a automação e criação de pipeline de deploys.
Para saber mais detalhes, clique em Fastlane.
É um serviço de computação em nuvem para gerenciamento de pipelines de CD/CI (Continuous Development/Continuous Integration).
Foi utilizado para acompanhar e controlar a evolução de funcionalidades por intermédio de entregas contínuas.
Para obter mais informações e planos disponíveis, por favor, vá ao site do Bitrise.
É o sistema operacional utilizado para o desenvolvimento de aplicativos mobile iOS.
É possível obter mais informações clicando no seguinte hyperlink macOS.
Este projeto visa criar um aplicativo iOS 13+ para aficionados em super-heróis, principalmente da Marvel, onde poderão compartilhar heróis favoritos e revistas, inicialmente.
As funcionalidades previstas para o projeto são:
- Gereciamento de heróis
- Gerenciamento de revistas
- Compartilhamento de heróis e revistas
- Salvar heróis e revistas como favoritos
- Armazenamento offline
- Login social usando Facebook e Google
- Entre outros
As imagens abaixo mostram um pouco a respeito do aplicativo em funcionamento.
Amostra do aplicativo em execução.
Tela de início da aplicação. Permite o login social por meio do Facebook e do Google. Além disso, é possível navegar para o cadastro de usuário.
Permite o cadastro de usuário por meio de e-mail e senha mediante o aceite dos Termos de Uso.
Lista de todos os heróis disponíveis. É possível favoritar ou compartilhar, além de busca por termo.
Permite visualizar os detalhes do heróis e as revistas relacionadas. É possível favoritá-lo ou compartilhá-lo.
Mostra todas as revistas disponíveis. É possível compartilhar, filtrar e favoritar revistas.
Permite configurar os dados da conta, tais como: troca de senha exclusão de conta.
Abaixo mostra a cobertura atual dos testes unitários da aplicação.
A imagem a seguir mostra a execução do Fastlane após uma execução com êxito.
A imagem abaixo é referente ao monitoramento de uso do Google Analytics.
Para obter o Certificado de Conclusão, é necessário implementar o projeto atendendo os seguintes requisitos:
- ✓ Deve possuir um design em todas as telas utilizando auto layout;
- ✓ Aplicação do POO.
- ✓ Deve possuir navegação entre telas (Navigation e Modal);
- ✓ Tratativas de erros;
- ✓ Deve consumir uma API;
- ✓ Deve funcionar em modo offline;
- ✓ A arquitetura deve ser MVVM;
- ✗ O código precisa estar comentado;
- ✓ Testes Unitários;
- ✓ O app deve conter, pelo menos, os seguintes componentes do UIKit: (UITextField, UIButton, UILabel, UICollectionView e UITableView).
- ✗ O app deve possuir as seguintes features:
- ✗ Tela de carregamento;
- ✓ Tela de login (Facebook e Google são obrigatórios);
- ✗ Tela inicial que deve conter um resumo das funcionalidades do app;
- ✓ Tela de descrição do item;
- ✓ Tela de listagem de características;
- ✓ Opções para compartilhamento em redes sociais;
- ✓ Todo o trabalho deve ser feito utilizando o GitFlow;
- ✗ Ao final, o ReadMe deve estar atualizado com screenshots das telas do app e descrição detalhada das funcionalidades.
Para executar o projeto, é necessário realizar algumas etapas para que o projeto possa ser compilado com êxito.
Para começar o projeto, você deve clonar o projeto com o seguinte comando:
git clone https://github.com/marivaldosena/hero.es.git heroes
Com este comando, o git irá criar um diretório chamado heroes. Nele, será possível visualizar três arquivos:
- README.md - Descrição do projeto
- assets - Arquivos de apoio, tais como: arquivos JSON, imagens para README, etc
- hero.es - Projeto iOS
No terminal, digite:
cd hero.es
Ao entrar neste diretório, você verá os seguintes arquivos:
- Podfile - Arquivo para configuração e download de bibliotecas do CocoaPods
- hero_es - Bundle do aplicativo móvel a ser executado
- hero_es.xcodeproj - Arquivo de configuração do projeto utilizado pelo Xcode
- hero_esTests - Teste unitários da aplicação
Para iniciar o projeto, digite:
pod install
Os arquivos gerados pelo comando pod install são:
- Podfile.lock - Arquivo de bloqueio de versão que serve para otimizar o download e atualização de novas bibliotecas
- Pods - Diretório contendo as bibliotecas do CocoaPods
- hero_es.xcworkspace - Novo arquivo de configuração do espaço de trabalho do Xcode. É este arquivo que deve ser aberto para desenvolvimento
Para executar o projeto, digite:
open hero_es.xcworkspace
O projeto possui uma estrutura de arquivos baseada em funcionalidades gerais. Entre os principais diretórios, podemos citar:
- Main - Este é o Entry Point da aplicação
- Shared - Funcionalidades compartilhadas por toda a aplicação, tais como: DBManager para gerenciar o banco de dados local e UIKitUtils para as relacionadas com a Interface Gráfica
- NomeDaFeature - Funcionalidade que estamos trabalhando
- hero_es.xcdatamodeld - Arquivo do Core Data para persistência de dados local
- AppDelegate.swift - Configuração da aplicação
Este projeto segue o padrão baseado em Clean Architecture, ou seja, procura dividir o projeto de acordo com suas responsabilidades. Dessa forma, a parte visual fica separada da lógica de negócios que está separada da que é responsável pelo consumo de APIs externas. Com isso, conseguimos ganhar maior autonomia, já que cada parte está desacoplada da outra.
Os princípios utilizados são diretrizes de como deve ser o desenvolvimento. No entanto, estas diretrizes não detalham como devemos implementar, mas o que devemos ter em mente ao desenvolver.
Separation of Concerns (SoC) diz respeito a separação das interfaces dentro do projeto, isto é, cada camada é responsável por um papel diferente.
Neste caso, há uma camada apenas para lidar com banco de dados que está separada da camada visual que está apartada das regras de negócio. Este princípio serve para permitir que uma alteração não afete negativamente outra camada.
Este princípio diz respeito a evitar a duplicação de código, pois é uma má prática de desenvolvimento. Dessa forma, aumentamos a consistência da base de código, já que as alterações serão realizadas em apenas um lugar.
É a diretriz para que o desenvolvimento seja escalável, de fácil manutenção e com melhor reaproveitamento de código. Esta diretriz (acrônimo) contém os princípios que serão detalhados a seguir.
Este princípio nos diz que devemos fazer que nossas classes e métodos desempenhem apenas uma função e esta função seja bem realizada.
Diz respeito a um funcionalidade (classe e/ou método) que é fechado para alteração, mas aberto para extensão, ou seja, que possa ser especializado por intermédio de polimorfismo e/ou herança.
O princípio de Liskov diz respeito a possibilidade de utilizar os sub-tipos, isto é, os tipos especializados de uma classe sem que haja necessidade de alteração da lógica e/ou execução.
O exemplo desta utilização é quando aceitamos uma classe base e podemos utilizar as instâncias de suas sub-classes no lugar dela.
Concerne a utilização de contratos específicos de execução por intermédio de interfaces que requerem a implementação de poucos métodos. Este princípio permite que classes distintas possam implementar uma mesma interface e manter a consistência da execução, além de permitir a aglutinação de diversas interfaces.
Este princípio reforça que devemos trabalhar encima de abstrações e não tipos concretos, ou seja, não precisamos entender os detalhes para utilizar determinada funcionalidade. Dessa forma, podemos alterar a implementação concreta em tempo de execução.
Protocol Oriented Programming ou Programação Orientada a Protocolos (POP) é um paradigma de programação criado e recomendado pela Apple para o Desenvolvimento iOS com linguagem Swift.
Protocolos e extensões possuem diversas aplicações dentro do mundo iOS. Os principais benefícios são:
- Maior consistência de desenvolvimento, já que devemos atender a um protocolo
- Maior flexibilidade, pois protocolos e extensões podem ser utilizados por classes e structs distintas e não relacionadas
- Facilidade de testes unitários
Diz respeito a melhoria contínua de código por meio de alterações que visam simplificar e tornar flexível o desenvolvimento.
O padrão de desenvolvimento utilizado é o MVVM (Model-View-ViewModel) que permite separar de forma mais eficaz a View do Model. Este projeto é dividido em alguns elementos principais conforme abaixo.
É responsável pela estrutura de dados e representa uma entidade e/ou tipo básico lógico. Ele está no cerne do sistema na camada de Domain e não sabe da existência das outras camadas. No entanto, todas as outras camadas trabalham com o Model como dados básicos. Neste caso, ele também atua como um DTO (Data Transfer Object).
Representa a parte gráfica da aplicação e é responsável pela interação com o usuário. Não sabe da existência do Model e trabalha com o ViewModel como interface entre ele e os dados que devem ser apresentados na tela.
É o intermediário entre a View e Model. É responsável pela tradução dos dados recebidos pela View e altera o Model de acordo. Também atua com o tratamento dos dados que devem ser apresentados à View. Com seu uso é possível facilitar a implementação de testes unitários, já que é um representante fiel do que será apresentado à View.
Contém as regras de negócios e é responsável pelo consumo de APIs externas, tais como: Rest, bases de dados locais, entre outros. É possível utilizar um serviço por mais de um ViewModel. Ele também efetua a comunicação entre ViewModels.
É responsável pela interface entre service e os DAOs (Data Acess Objects), ou seja, abstrai a comunicação com as bases de dados locais.
É o componente responsável pela abstração e persistência de dados em bases locais. É aconselhável utilizar um DAO (Data Access Object) para cada entidade e store (base de dados).
É responsável pela conversão entre as entidades e models. O ModelParser abstrai a tradução de um JSON, Entity do CoreData ou Realm para o Model e vice-versa. Dessa forma, repositories podem utilizar os Models sem se preocuparem com as implementações de baixo nível.