Beruflich Dokumente
Kultur Dokumente
Escola Politécnica
Autor(es):
_________________________________________________
Calebe Eler De Carvalho De Souza
Orientador:
_________________________________________________
Flávio Luis de Mello
Examinador:
_________________________________________________
Manoel Villas Boas Junior
Examinador:
_________________________________________________
Andressa dos Santos Nicolau
Examinador:
_________________________________________________
Alan Miranda Manteiro de Lima
MBCA
ii
DEDICATÓRIA
Dedico este trabalho os meus pais e a minha esposa que sempre me incentivavam e
apoiaram a conquistar mais esta etapa em minha vida.
iii
AGRADECIMENTO
Primeiramente a Deus por me dar saúde e sabedoria para realizar todo este
processo de monografia.
A minha família que em todos os momentos acreditaram em mim e me apoiaram
nesta jornada.
Ao meu amigo Wallace, que sempre me apresentou idéias inovadoras para que eu
melhore como profissional.
A todas as amizades feitas durante este curso, que sempre com dedicação, me
ajudaram neste processo acadêmico.
iv
RESUMO
v
ABSTRACT
This work aims to present a prototype of a native mobile application coded only
with JavaScript to be used in an Android system. First, it presents the usage of various
technologies, such as JavaScript, CSS, ReactJS will be approached to finally describe
the React Native that will be used to execute the proposal. A prototype was created so
that it was possible to perform some useful actions, such as the use of maps, requisitions
for servers, among others, which illustrate the efficiency of this framework. Thus, it was
possible to observe that it is feasible to create multi-platform applications with only one
front-end language, therefore, the ReactJS is an effective alternative for coding.
vi
SIGLAS
vii
Sumário
Capítulo 1: Introdução....................................................................................................1
1.1 – Tema.........................................................................................................................1
1.2 – Delimitação..............................................................................................................1
1.3 – Justificativa.............................................................................................................1
1.4 – Objetivos..................................................................................................................2
1.5 – Metodologia.............................................................................................................3
1.6 – Descrição.................................................................................................................3
2.1 – JavaScript................................................................................................................5
2.2 – CSS...........................................................................................................................6
2.3 – DOM........................................................................................................................7
2.4 – ReactJS....................................................................................................................9
2.5 – As plataformas móveis IOS e Android ...............................................................10
2.6 – React Native..........................................................................................................11
4.1 – Conclusão..............................................................................................................23
4.2 – Trabalhos Futuros................................................................................................23
Bibliografia.....................................................................................................................24
vii
Lista de Figuras
1 – Código HTML sem CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1
ix
Lista de Tabelas
8
1 – Mercado Internacional de Smartphones em 2015 pelo IDC . . .. . . . . . . . . . . ..
x
Capítulo 1
Introdução
1.1 – Tema
1.2 – Delimitação
O público alvo a ser alcançado com este trabalho são os desenvolvedores Front-
end que não conhecem Java para o desenvolvimento de aplicativos Android, ou Swift
para o desenvolvimento de aplicativos IOS. Entretanto, utilizando uma linguagem em
que tenham mais conhecimento, serão capazes de se aventurar na criação de aplicativos
para ambas as plataformas utilizando JavaScript.
1.3 – Justificativa
1
possuem uma ótima performance, porém, é mais caro para se desenvolver. Neste caso, a
empresa precisa contratar uma equipe de desenvolvedores para Android e outra para
IOS, tendo no final dois produtos diferentes, com códigos e manutenções diferentes,
assim como problemas diferentes para serem resolvidos. Além disso, há também a
questão da velocidade de desenvolvimento de cada equipe, que poderia acarretar o
término do aplicativo para um sistema operacional antes da outra.
A segunda forma é o Mobile Web, que são páginas web feitas em HTML5 que
são carregadas no navegador do dispositivo mobile. Sua grande vantagem é que os sites
podem ser acessados por qualquer meio eletrônico que possua um navegador, porém
não possui um bom desempenho e não é possível utilizar-se das funcionalidades dos
dispositivos móveis, como flash, vibrador, câmera, etc.
A terceira forma é a Hibrida, que possui como vantagem o menor custo de
desenvolvimento, pois é escrito um único código para Android e IOS, porém possui
uma baixa performance com relação ao método nativo. Com o tempo surgiram algumas
plataformas de desenvolvimento híbridas como Cordova, PhoneGap e Ionic, que
codificam os aplicativos em HTML5, CSS3 e Javascript. Os aplicativos desenvolvidos
dessa forma, utilizam-se de uma webview e podem ser instalados tanto para Android e
IOS. Uma Webview é o nome de um browser que roda como se fosse o aplicativo
aberto pelo usuário. O usuário não percebe que está dentro de um browser pois essa
webview não contém componentes característicos de um, como a barra de endereço e
barra de favoritos, etc. A webview contém apenas o necessário para que o html, css e
javascript funcionem. Ela se comporta como a engine de renderização da app, porém o
desempenho e velocidade dele são inferiores de um aplicativo desenvolvido de forma
nativa, isto é, utilizando o JAVA e/ou SWIFT para o desenvolvimento. Ainda não era a
solução ideal, pois estava utilizando-se de códigos não nativos para criação de
aplicativos, sacrificando o desempenho.
Foi então que o Facebook com sua equipe de engenheiros, criou o React Native,
onde o desenvolvedor com apenas uma linguagem de programação consegue construir
uma aplicação nativa para duas plataformas. Por ser uma tecnologia nova, o React
Native se propõe a disponibilizar tecnologias modernas no desenvolvimento front-end,
tendo uma variedade de ferramentas que possibilitam a criação de aplicativos móveis
nativos. É uma poderosa que tem como característica a criação e a reutilização de
componentes, além de possuir uma variedade de integrações com outras bibliotecas,
como o ECMAScript 6, Flexbox e o JSX. [1]
2
1.4 – Objetivos
1.5 – Metodologia
3
1.6 – Descrição
4
Capítulo 2
Fundamentação Teórica
2.1 – JavaScript
5
Como o código JavaScript fica exposto na parte do cliente, podendo ser
facilmente visualizado, pode ser considerado uma desvantagem, por apresentar essa
brecha.
O JavaScript foi originalmente feito para que se pudesse executar em um site de
uma forma mais leve, algumas ações existentes em outras linguagens compiladas. Hoje
em dia, pode-se dizer que o JavaScript, junto com o HTML e o CSS se tornou um dos
pilares fundamentais da web existente.
2.2 – CSS
Na imagem 2.2, observa-se como é feito para realizar a utilização do CSS. Será
feito na tag head da página HTML dentro da tag style.
6
Figura 2.2 – Utilização do CSS
Como observado na figura 2.2, para criar o CSS para um elemento, será preciso
dizer primeiro qual é o elemento em questão, depois informar quais suas propriedades e
valores que serão alterados. A figura 2.3 mostra detalhadamente como funciona os
atributos do CSS.
2.3 – DOM
7
Figura 2.4 – Exemplo de uma árvore DOM de um HTML[17].
A figura 2.4 acima exemplifica a estrutura de uma árvore DOM de uma página
HTML onde todos os elementos da árvore são denominados como “node-tree” e
possuem uma relação hierárquica entre si.
A primeira versão do DOM foi lançada em 1998 pela W3C, a segunda em 2000,
e, por fim, a terceira versão foi lançada em 2004.
Uma das vantagens disto, é poder acessar qualquer elemento desta árvore de
forma prática e rápida. Para facilitar ainda mais este processo, temos uma biblioteca
javascript muito utilizada para manipulação de elementos DOM de uma página HTML é
o JQuery. Através dele é possível acessar e manipular diretamente quaisquer elementos.
Abaixo temos vários exemplos de como encontrar esses elementos e alterar suas
propriedades na página HTML utilizando o Jquery.
// pinta o fundo de um formulário com o id “form” de azul
$(‘#form’).css(‘backgroundcolor’,’blue’);
// escondende os elementos que tenha a class igual a “linha”
$(‘.linha’).hide();
// muda o texto de todos os paragrafos
$(‘p’).text(“hello world!”);
8
2.4 – ReactJS
9
Figura 2.5 – Funcionamento do Virtual DOM [14].
10
2015* 2015* 2015* 2019* 2019* 2019*
5-Year
Region Shipment Market YoY Shipment Market YoY
CAGR
Volumes Share Growth Volumes Share Growth
Windows
36.9 2.6% 5.8% 67.8 3.6% 12.8% 14.2%
Phone
11
Flexbox, JSX, diversos pacotes do NPM e muito mais. Sem contar que nos permite
fazer debug na mesma IDE utilizada para o desenvolvimento nativo com essas
plataformas[...]” [1].
12
equipe, é possível desenvolver para as duas plataformas utilizando o mesmo código.
Isso provê uma economia enorme para uma empresa.
Outra vantagem é a simplicidade que é o desenvolvimento híbrido mobile. Criar
uma aplicação utilizando JavaScript como linguagem principal se tornou uma tarefa
muito simples, mesmo para quem não tem conhecimento de JavaScript, pois sua curva
de aprendizado é muito baixa.
A compatibilidade com plugins externos também é algo a ser destacado. É
possível incorporar a sua aplicação, por exemplo, o Google Maps, possibilitando que
você o insira a um módulo nativo. Com isso você poderá utilizar-se das funções
principais do seu plugin, como por exemplo zoom, rotação, etc, utilizando menos
memória e carregando de forma mais rápida [3].
Carlos Cabral cita uma das vantagens “... oferecidas pelo framework é poder
criar aplicações agnósticas, que compartilham a mesma base de código [1]. Neste caso,
você poderia ter os arquivos index.ios.js e index.android.js apontando para uma classe
“root”, responsável por executar o código com base no sistema utilizado pelo usuário:
iOS ou Android. Isso é possível se você fizer uso de componentes que não são
específicos de cada plataforma, como View, Image, ListView, MapView, Modal,
TouchableHighlight, Text, etc.”.
13
Capítulo 3
Propostas Tecnológicas
Baseado nas tecnologias descritas nos capitulos anteriores foi proposta uma
solução para criação de aplicativos através de códigos escritos totalmente em javascript.
A execução da idéia consiste em pegar esse código e realizar a compilação dele
utilizando o React Native para geração de um aplicativo nativo que funcione em
qualquer dispositivo para qual a compitação foi feita. Se a escolha da geração for para
um dispositivo Android ou um dispositivo IOS assim o aplicativo será gerado.
14
Figura 2.7 – Processo de criação da aplicação
Após a criação deste arquivo, para carregá-lo e utilizar os estilos definidos nele.
Primeiro deve-se importá-lo no arquivo principal “index.android.js”. Ao importar,
define-se um nome de variável para ele e a partir desta variável “meusEstilos”, pode-se
acessar todos os estilos definidos neste arquivo como mostra a figura a seguir.
15
Figura 2.9 – Exemplo de um arquivo JavaScript utilizando CSS
16
Figura 3.0 – Tela inicial do protótipo
Selecionando a opção “Múltipla escolha” será exibido uma tela com opções, e
cada opção abrirá uma tela de acordo com o selecionado, assim como mostra a figura
3.1.
17
Figura 3.1 – Tela de múltipla escolha do protótipo
Para cada opção, existe um método que redireciona para a tela escolhida. Por
exemplo, ao acionar o botão “Verão” é disparado o método que realiza o direcionamento
para outra tela. No Anexo 1 é apresentado o código fonte desta tela onde é gerado os
botões com as ações de abrir a tela escolhida.
Ao selecionar uma das opções da Múltipla escolha outra tela é aberta com a
opção escolhida. Na figura 3.2 abaixo, foi selecionado a opção “Verão” e a tela
correspondente foi aberta.
18
Figura 3.2 – Tela com a opção “Verão” da escolhida do protótipo
A imagem é carregada no plano de fundo da tela de uma página web pelo link
http://mgturismo.com.br/wp-content/uploads/2016/01/verao-paraiso.jpg. No Anexo 2 é
detalhado o código fonte.
Voltando para tela principal do protótipo, tem-se o botão MAPA. Ao selecionar
essa opção é aberto uma tela para navegação de mapa utilizando o plugin do Google
Maps, conforme mostra na Figura 3.3.
19
Figura 3.3 – Tela de navegação do mapa utilizando o plugin do Google Maps
No Anexo 3 temos o código fonte da tela do mapa onde foi incluído a tag
<MapView> para exibição do mapa na tela. Nela é carregada o mapa pela posição da
localização do usuário.
Na última opção do protótipo, foi criado uma interface para buscar filmes pelo
nome em um servidor, realizando uma requisição Ajax. Na figura 3.4 observa-se o
exemplo de funcionamento buscando filmes com o nome “Matrix”.
20
Figura 3.4 – Pesquisa de filmes
21
Figura 3.5 – Instalação de aplicativo
22
Capítulo 4
4.1 – Conclusão
23
Bibliografia
[1] CABRAL, C., “React Native: Construa aplicações móveis nativas com Javascript”,
https://tableless.com.br/react-native-construa-aplicacoes-moveis-nativas-com-
javascript/, 5 Abril 2016, (Acesso em 10 Dezembro 2016).
[2] KAY, D., “Getting Started with React Native on Ubuntu Linux”,
http://www.proreactnative.com/Getting-Started-with-React-Native-on-Ubuntu-Linux/, 3
Fevereiro 2016, (Acesso em 10 Dezembro 2016).
[8] ANDERSON, C., “A Glimpse Into The Future With React Native For Web”,
https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-
native-for-web/, 8 Agosto 2016, (Acesso em 15 Dezembro 2016).
24
[13] FERREIRA, D., “#1 - Começando com ReactJS”,
https://willianjusten.com.br/comecando-com-react/, 10 Julho 2015, (Acesso em 21
Dezembro 2016).
[15] IDC, “Worldwide Smartphone Growth Expected to Slow to 10.4% in 2015, Down
From 27.5% Growth in 2014, According to IDC”, http://www.idc.com/getdoc.jsp?
containerId=prUS25860315, 25 Agosto 2015, (Acesso em 21 Dezembro 2016).
25
Anexo 1
render() {
var navigator = this.props.navigator;
return (
<Text style={style.textoTitulo}>
Multipla Escolha
</Text>
<Text>
Selecione uma das estações do ano abaixo:
</Text>
</View>
26
</View>
);
irParaOpcaoA() {
this.props.navigator.push({
id: 'PaginaOpcaoA',
sceneConfig: Navigator.SceneConfigs.FloatFromLeft,
});
}
irParaOpcaoB() {
this.props.navigator.push({
id: 'PaginaOpcaoB',
sceneConfig: Navigator.SceneConfigs.FloatFromLeft,
});
}
irParaOpcaoC() {
this.props.navigator.push({
id: 'PaginaOpcaoC',
sceneConfig: Navigator.SceneConfigs.FloatFromLeft,
});
}
irParaOpcaoD() {
this.props.navigator.push({
id: 'PaginaOpcaoD',
sceneConfig: Navigator.SceneConfigs.FloatFromLeft,
});
}
27
Anexo 2
render() {
var navigator = this.props.navigator;
return (
<Text style={style.textoTitulo}>
Verão
</Text>
<Image
style={{width: 520, height: 530}}
source={{uri: 'http://mgturismo.com.br/wp-
content/uploads/2016/01/verao-paraiso.jpg'}}
/>
</View>
</View>
28
</View>
);
}
}
29
Anexo 3
constructor(props) {
super(props);
this.state = {
region: {
latitude: LATITUDE,
longitude: LONGITUDE,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
},
};
}
componentDidMount() {
navigator.geolocation.getCurrentPosition(
(position) => {
this.setState({
region: {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
}
});
30
},
(error) => alert(error.message),
{enableHighAccuracy: true, timeout: 20000, maximumAge:
1000}
);
this.watchID =
navigator.geolocation.watchPosition((position) => {
const newRegion = {
latitude: position.coords.latitude,
longitude: position.coords.longitude,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA
}
this.onRegionChange(newRegion);
});
}
componentWillUnmount() {
navigator.geolocation.clearWatch(this.watchID);
}
onRegionChange(region) {
this.setState({ region });
}
render() {
var navigator = this.props.navigator;
return (
<Text style={style.textoTitulo}>
Mapa
</Text>
<MapView
ref="map"
31
mapType="terrain"
style={style.map}
region={this.state.region}
onRegionChange={this.onRegionChange}>
<MapView.Marker coordinate={{latitude:
this.state.region.latitude,
longitude: this.state.region.longitude}}
title={"title"}
description={"description"}>
</MapView.Marker>
</MapView>
</View>
</View>
);
}
}
32
Anexo 4
constructor(props) {
super(props);
this.state = {
dataSource: new ListView.DataSource({ rowHasChanged:
(row1, row2) => row1 !== row2, }),
loaded: false
};
}
componentDidMount() {
this.fetchData();
}
fetchData() {
var url = 'http://api.themoviedb.org/3/search/movie?
api_key=50821499b7f35e33dde8c426315ff6a9&query=';
var searchText=this.state.searchText;
if ( searchText != null ) {
url += searchText;
fetch(url)
.then((response) => response.json())
.then((responseData) => {
this.setState({
dataSource:
this.state.dataSource.cloneWithRows(responseData.results),
loaded: true
});
})
.done();
33
}
}
render() {
var navigator = this.props.navigator;
return (
<TextInput
style={style.searchBar}
value={this.state.searchText}
onChangeText={(searchText) =>
this.setState({searchText})}
placeholder="Pesquisar Filme" />
<Text></Text>
<View style={{flex: .3,flexDirection: 'row'}}>
<Button onPress={() => this.fetchData()}
style={{borderWidth: 3, borderColor: 'red'}} title="Pesquisar"
color="#246dd5" accessibilityLabel="Pressione o botão para
pesquisar" />
<Button onPress={() => navigator.pop()}
title="Voltar" color="#DC143C" accessibilityLabel="Pressione o botão
para voltar" />
</View>
<Text></Text>
</View>
34
<View style={{flex: 9, flexDirection: 'row',
alignItems: 'center', justifyContent:'flex-start', backgroundColor:
'white'}}>
<ListView dataSource={this.state.dataSource}
renderRow={this.renderMovie} style={styles.listView} />
</View>
</View>
);
}
renderMovie(movie) {
return (
<View style={styles.container}>
<Image source={{uri:
'https://image.tmdb.org/t/p/w500/'+movie.poster_path}}
style={styles.thumbnail} />
<View style={styles.rightContainer}>
<Text style={styles.title}>{movie.title}</Text>
<Text
style={styles.year}>{movie.release_date}</Text>
</View>
</View>
);
}
}
35
Anexo 5
Java JDK
- No terminal, insira o comando abaixo para instalar o Java JDK
sudo apt-get install openjdk-7-jdk
Android SDK
- No terminal, digite o comando abaixo para baixar o Android SDK
wget https://dl.google.com/android/android-sdk_r23-linux.tgz
- Após baixar, descompacte-o
tar -xvf android-sdk_r23-linux.tgz
- Entre no diretório de ferramentas do Android SDK
cd android-sdk-linux/tools
- Inicie o Android SDK Manager para instalá-lo
./android
- Com o Android SDK Manager aberto:
Selecione na Pasta Tools o Android SDK Tools e o Android SDK Plataform-
Tools como mostra a Figura 3.6.
36
Figura 3.6 – Selecionando Android SDK Tools para instalação do Android SDK.
Selecione também todos os itens da pasta Android 7.1.1 (API 25) como mostra a
figura 3.7.
37
Figura 3.8 – Selecionando Android 7.1.1 para instalação do Android SDK.
NodeJS
- O Node.js é um interpretador de código JavaScript que funciona do lado do
servidor para instalar, em um termina digite os comandos abaixo:
sudo apt-get install -y build-essential
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
sudo apt-get install -y nodejs
NPM
- O NPM é um pacote de gerenciamento de códigos JS. Primeiro, digite o
comando which npm em um terminal para verificar se sua distribuição de
Ubuntu já o tem. Se não tiver, será utilizado o comando abaixo para instalação:
curl http://npmjs.org/install.sh | sh
Whatman
38
- O Whatman é uma ferramenta desenvolvida pelo Facebook feita para observar
o log do sistema. Em um terminal, digite os comandos abaixo:
git clone https://github.com/facebook/watchman.git
cd watchman
git checkout v4.1.0
./autogen.sh
./configure
make
sudo make install
Flow
- O Flow serve para análise estática de códigos JavaScript. Para instalar, digite
os comandos abaixo em um terminal:
wget
https://github.com/facebook/flow/releases/download/v0.37.4/flow-
linux64-v0.37.4.zip
unzip flow-linux64-v0.37.4.zip
cd flow
sudo mv flow /usr/local/bin/flow
React Native
- Finalmente é realizada a instalação do React Native propriamente dito:
sudo npm install -g react-native-cli
39
Figura 3.9 – Estrutura de diretórios de novo projeto do React Native.
Terá que ser copiado a identificação deste dispositivo, que neste caso é “0fce”,
para adicionar esta identificação nas regras de dispositivos Android a serem utilizados
pelo ADB (Android Debug Bridge).
40
Para isso em seu terminal digite o comando abaixo:
sudo vim /etc/udev/rules.d/51-android.rules
Com o arquivo aberto adicione a linha com a identificação do dispositivo.
SUBSYSTEM=="usb", ATTR{idVendor}=="0fce", MODE="0666",
GROUP="plugdev"
Para verificar que seu dispositivo está conectado ao ADB, utilize o comando
“adb devices” e verifique se ele foi encontrado, como mostrado na figura 4,1 abaixo.
41
Figura 4.2 – Aplicação rodando no dispositivo android.
Na figura 4.3, tudo começa quando o código Javascript é salvo. O React Native
solicita ao Webserver um novo pacote. O Webserver gera e salva um pacote novo,
atualizando para o desenvolvedor que o novo pacote será iniciado.
42