Digital House | Projeto Integrador | Heroes

Swift Xcode CocoaPods

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

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

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.

Xcode

É 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.

CocoaPods

É 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

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.

Crashlytics and Google Analytics

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

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

KingFisher é uma biblioteca de carregamento de imagens, caching, entre outras funcionalidades para iOS/Swift.

Cliquem aqui para saber mais.

SwiftyJSON

SwiftyJSON é uma biblioteca para serialização e desserialização Swift com foco em parsing de JSON.

Para obter mais informações, clique em SwiftyJSON.

Fastlane

É 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.

Bitrise

É 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.

macOS

É o sistema operacional utilizado para o desenvolvimento de aplicativos mobile iOS.

É possível obter mais informações clicando no seguinte hyperlink macOS.

Voltar ao menu

Descrição

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.

Funcionalidades Previstas

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

Voltar ao menu

Imagens do Projeto

As imagens abaixo mostram um pouco a respeito do aplicativo em funcionamento.

Aplicativo Rodando

Amostra do aplicativo em execução.

Aplicativo em Execução

Voltar ao menu

Tela Inicial

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.

Tela Inicial

Voltar ao menu

Cadastro

Permite o cadastro de usuário por meio de e-mail e senha mediante o aceite dos Termos de Uso.

Cadastro

Voltar ao menu

Lista de Heróis

Lista de todos os heróis disponíveis. É possível favoritar ou compartilhar, além de busca por termo.

Lista de Heróis

Voltar ao menu

Detalhes de Herói

Permite visualizar os detalhes do heróis e as revistas relacionadas. É possível favoritá-lo ou compartilhá-lo.

Detalhes de Herói

Voltar ao menu

Lista de Revistas

Mostra todas as revistas disponíveis. É possível compartilhar, filtrar e favoritar revistas.

Lista de Revistas

Voltar ao menu

Configuração

Permite configurar os dados da conta, tais como: troca de senha exclusão de conta.

Configuração

Voltar ao menu

Testes Unitários

Abaixo mostra a cobertura atual dos testes unitários da aplicação.

Testes Unitários

Voltar ao menu

Execução do Fastlane

A imagem a seguir mostra a execução do Fastlane após uma execução com êxito.

Fastlane

Voltar ao menu

Relatório do Google Analytics

A imagem abaixo é referente ao monitoramento de uso do Google Analytics.

Google Analytics

Voltar ao menu

Requisitos do Projeto

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.

Voltar ao menu

Como Executar o Projeto

Para executar o projeto, é necessário realizar algumas etapas para que o projeto possa ser compilado com êxito.

Etapas

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

Voltar ao menu

Estrutura de Arquivos

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

Voltar ao menu

Padrões de Projeto

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.

Clean Architecture

Princípios Utilizados

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

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.

Don't Repeat Yourself

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.

SOLID

É 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.

Single Responsibility Principle

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.

Open/Closed Principle

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.

Liskov Substitution Principle

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.

Interface Segregation Principle

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.

Dependency Inversion Principle

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

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

Refatoração

Diz respeito a melhoria contínua de código por meio de alterações que visam simplificar e tornar flexível o desenvolvimento.

Voltar ao menu

Elementos Principais

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.

Componentes Principais

Model

É 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).

View

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.

ViewModel

É 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.

Service

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.

Repository

É responsável pela interface entre service e os DAOs (Data Acess Objects), ou seja, abstrai a comunicação com as bases de dados locais.

Data Access Object

É 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).

ModelParser

É 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.

Voltar ao menu