Um aplicativo iOS que mostra fotos de diferentes raças de cachorro.
- Xcode 11.3.1
- Swift 5.0
- iOS 11.0
OBS:
Nos requesitos para o desenvolvimento do app foi solicitado iOS 9.0, eu o considero muito antigo e um tanto trabalhoso manter suporte para uma versao tão antiga, ainda mais levando em consideração iOS 13, darkmode além de algumas novas funcionalidades.
Tenho trabalhado nesse último ano em projetos de grande porte, como Globo Esporte e Globoplay onde o target minimo é o iOS 11.4
- Clone esse repositório
- Rode o script
./setup.sh
- Abra o arquivo
.xcworkspace
- Rode o projeto 🚀
OBS 1:
Esse projeto usa o xUnique uma dependência do Python que serve para manter o arquivo .pbxproj
organizado, então lembre-se de commitar os arquivos alterados por ele.
OBS 2:
Esse projeto usa o bundler para o controle de gems como cocoapods, fastlane, slather, então caso queira instalar os pods ou atualiza-los faça através do comando bundle exec pod ...
Esse aplicativo segue o VIP (Clean Swift Architecture)
OBS:
Os componentes externos que se comunicam com os Interactors
estão abstraídos em Workers
- Commons: Contém Protocols, Extensions, Helpers e Components que são usados em várias partes do projeto
- ImageLoader: Abstração para a biblioteca Nuke que realiza o download e cache das imagens
- Models: Abstração dos modelos utilizados pelas requests
- Network: Abstração para a realização de requests
- Security: Abstração para a biblioteca KeychainSwift
OBS 1:
Os módulos foram criados pensando-se em transforma-los em pequenos frameworks
OBS 2:
Como não existe na documentação um endpoint que retorna as 4 possíveis raças, considerei inviável a realização de 4 requests, apenas para obter o nome da raça a ser utilizada para retornar a lista de links usada na galeria, sendo assim essa chamada foi feita através de um mock, onde a estrutura retorna o nome da raça e um boolean que representa a existência ou não de fotos.
Todas as dependências e bibliotecas de terceiros utilizadas nesse projeto e suas respectivas versões podem ser encontradas no Podfile.
- R.swift Usado para deixar recursos como imagens, cores e fontes customizadas fortemente tipadas evitando o uso de strings hard coded
- SwiftLint Ferramenta para reforçar o estilo Swift e suas convenções
- Nuke Usado para fazer o download e cache das imagens, escolhida pelo seu alto desempenho, recursos, testes, constantes atualizações e credibilidade
- KeychainSwift Usado para persistir dados sensíveis no
Keychain
, escolhido pela sua facilidade de uso e credibilidade
- Viewcode
- Uso de principios SOLID
- Escalável
- Muitas partes reutilizáveis
- Testável
- Ficou implícita a implementação de um autologin e este foi implementado
- Fácil para implementar fluxos alternativos, como onboardings e fluxos que exigem ou não autenticação
- Testes unitários, instrumentados e UI
- Checagem de conexão
Reachability
- Separação de ambientes de desenvolvimento (prod,dev e stg)
- Criar uma estrutura que encapsula a navegação (por exemplo
Navigator
) - Abstrair as scene factories para
protocols
- Suportar darkmode
# idwall-mobile-test
Crie um aplicativo para Android (Kotlin ou Java) ou iOS (Swift ou Object C) com as seguintes características:
* Criar uma tela de login onde o usuário precisa digitar um endereço de email válido.
* Armazene localmente o token retornado pela API no login.
* Após o login feito com sucesso, redirecione para uma tela onde deve conter as listas com as imagens
* Crie uma forma para que o usuário possa navegar entre as quatro raças de cachorros (husky, labrador, hound e pug)
* Ao clicar em uma imagem, ela deve ser exibida de forma expandida.
Requisitos técnicos
* Fazer cache das imagens
* Versão mínima: Android API 16 ou iOS 9
* É recomendado o uso de libs de terceiros para:
* chamadas de rede
* download e cache das imagens
* O uso de todas as libs deve ser justificado no README.
* Faça um README documentando tópicos que julga importante para quem for avaliar, tais como arquitetura, libs, decisões, como executar o projeto, etc.
* Caso tenha desenvolvido para Android, disponibilize o .apk.