Implementando Cocoa Touch Frameworks e compartilhando com sua equipe — Parte 1
No VivaReal, atualmente trabalhamos com 3 aplicativos: VivaReal, para os consumidores que buscam imóveis para alugar ou comprar, o VivaPro, para os corretores e imobiliárias anunciarem seus imóveis e conversarem com os clientes e o VivaProprietário, para os proprietários publicarem os seus próprios anúncios.
Durante o projeto dos nossos apps, percebemos que algumas interfaces e funcionalidades poderiam se repetir entre eles. Por isso, decidimos criar componentes, ou Cocoa Touch Frameworks, para compartilhar código internamente entre nossos apps.
Felizmente, essa ideia só trouxe benefícios para nossa equipe:
- Compartilhamento e padronização de código. Evitamos códigos duplicados e, consequentemente, bugs. Além disso, caso haja algum bug, não precisamos nos preocupar em corrigir nos apps, apenas no framework;
- Padronização da UI entre nossos apps. Nosso time de UX pode ficar tranquilo: nossos componentes de interface terão a mesma aparência e seguirão as guidelines em todos nossos apps.
Neste artigo, discutiremos sobre como é o processo de implementação de Cocoa Touch Frameworks e integração em projetos localmente.
Na segunda parte, no próximo artigo, a discussão será focada no método de compartilhamento privado que usamos nos nossos projetos, o CocoaPods. Ele é um gerenciador de dependência para projetos em Swift ou Objective-C que facilita bastante o compartilhamento de frameworks, sejam eles privados ou open source.
Cocoa Touch Frameworks
Basicamente Cocoa Touch Frameworks servem para compartilhar código entre aplicativos ou entre aplicativos e suas Extensions (como um Today Widget, por exemplo).
No Viva, um dos componentes que temos define classes com modelos e regras de negócio que devemos seguir nos nossos apps. Outros são focados em componentes gráficos, como Views e View Controllers.
Criando um novo Framework
Para criar um novo componente, abra o Xcode, selecione a opção para criar um novo projeto e então, selecione o template de Cocoa Touch Framework.
Até o iOS 7, Cocoa Touch Static Library era a nossa única opção para implementar um conjunto de classes e métodos e reusá-los em diferentes apps. Bibliotecas estáticas são linkadas em tempo de compilação, ou seja, os objetos são copiados para o executável final do app. No nosso caso, fez mais sentido optarmos por um Framework, pois:
- Não podemos associar assets a uma biblioteca estática;
- Em um Framework, Views podem ser editadas no Interface Builder, o que não é possível em uma biblioteca estática;
- O iOS carrega apenas uma cópia do Framework no sistema e a compartilha com todos os apps ou Extensions que o utilizam;
- Facilidade de compartilhamento. Com Frameworks, todo o código e assets são reunidos em um único arquivo.
Felizmente, a partir do iOS 8, a Apple liberou a criação e distribuição de Frameworks pelos desenvolvedores. 🎉
Iniciando a implementação do Framework
A imagem abaixo mostra o recém criado VivaFramework. A pasta VivaFramework é onde vamos colocar as classes, storyboards, xibs, imagens e quaisquer outros recursos que quisermos compartilhar.
Ao criar um novo Framework, você tem também a opção de adicionar targets para testes automatizados, tanto de UI quanto unitários. No caso abaixo, criamos um target para testes unitários, os quais, nesse exemplo, implementamos dentro da pasta VivaFrameworkTests.
Criando uma classe
Para criar uma classe e compartilhar com outros aplicativos, você fará praticamente o mesmo processo que faria no projeto de um aplicativo normal.
Como exemplo, criamos a classe Property, a qual define as informações de um imóvel e possui um método que retorna a sua descrição.
Há um ponto que devemos destacar nesse código.
Para tornar a classe Property acessível a outros projetos que importarem o VivaFramework, devemos adicionar o modificador de acesso public. Percebam que ele é adicionado tanto na definição da classe quanto nos métodos init e propertyDescription.
Criando uma View
Criar uma View é tão simples quanto no exemplo acima!
No código abaixo, temos um botão customizado, que altera a cor do background de acordo com a propriedade enabled. Além disso, ele mostra também uma imagem no canto esquerdo do botão.
Para criar a UIImage, é necessário utilizar o construtor que identifica o Bundle onde a imagem está. Como o Bundle é o mesmo da classe, utilizamos o NSBundle(forClass:) para criarmos uma referência para ele.
Testando o Framework no seu projeto
Para testar em outro projeto, primeiramente basta rodar uma build (Command + B) no Framework. Logo após, o arquivo .framework ficará disponível no Navigator.
Esse é o arquivo que será importado no projeto que usará as classes do nosso Framework. Para localizá-lo facilmente, basta usar o clique secundário, visualizar as opções do arquivo e clicar em Show in Finder.
Uma vez que você já tem o arquivo .framework, abra o projeto onde ele será integrado, selecione o seu Target, a seção Link Binary With Libraries, dentro da aba Build Phases, e então adicione o arquivo .framework gerado anteriormente.
Na aba General, adicione o arquivo do framework na seção Embedded Binaries.
Pronto! Agora você já pode testar o framework no seu projeto! 🎉
Uma vez que o Framework foi integrado corretamente, basta importá-lo usando import VivaFramework e usar a classe criada lá, como no exemplo abaixo.
Conclusão
Nesse artigo foi descrito como implementar um Cocoa Touch Framework do zero e como integrá-lo em um projeto.
Na próxima parte do artigo, aprenderemos como compartilhar de uma maneira mais robusta utilizando CocoaPods. Tudo o que você precisará para integrar um framework utilizando esse método será adicionar uma linha no arquivo de configuração do CocoaPods. Além disso, com esse método é bem mais fácil atualizar a versão do Framework em cada app. 🙏
Dessa maneira, será muito mais fácil compartilhar um Framework com os apps da empresa onde você trabalha, ou, se for um projeto open source, com toda a comunidade.