Construyendo apps de tiempo real con
@HybridAppsCol
Hybrid Apps Colombia
Nuestros patrocinadores
Conferencista
(@nicobytes)
Nicolas Molina Monroy
Desarrollador de aplicaciones web y móviles utilizando tecnologías híbridas
Actualmente trabajando para un estudio digital, con énfasis en el desarrollo de Software.
Ionicframework + Firebase
Aprende a trabajar con estas dos increíbles tecnologías para desarrollar tu aplicación móvil.
Conocerás cómo integrar bases de datos NoSql con firebase, haciendo que tu aplicación tenga conexión en tiempo real con tus datos
Antes de empezar
Visión general
Evolución de las aplicaciones web
Evolución de las aplicaciones web
Evolución de las aplicaciones hibridas
Evolución de las aplicaciones hibridas
¿Que es un BaaS?
Un Backend as a Service, es un modelo de servicio para otorgar a desarrolladores WEB Y de App Moviles una forma de vincular sus apps con almacenamiento y servicios analíticos entre otros
Back-end
Velocidad
Seguridad
Auntenticación
Persistencia
Presentamos a
El Back-end en tiempo real para tu APP
Resultado
-
Bases de datos NoSQL
-
Uso intensivo de JSON
-
Realtime
-
Offline
-
Multiplataforma
-
RESTful API
-
Todas las anteriores...
-
Y mas...
Presentamos a
Aplicaciones hibridas
- Podemos utilizar nuestros conocimientos web en HTML, JS Y CSS
- Corren en un Webview
- Se conectan a las partes nativas por medio de cordova
- Una sola base de codigo
"Quiero un app nativa"
No siempre es lo adecuando
Desventajas de Nativo
-
Conocimiento en cada plataforma
-
Base de código totalmente independiente
-
El desarrollo toma tiempo
-
Decremento pobre
Todas las plataformas
Nuestro error más grande fue apostar
demasiado en HTML5
El tiempo a pasado
Las capacidades de los dispositivos han cambiando rotundamente y el desarrollo front-end es otro totalmente diferente
Obsesionado por la rapidez
Basado en
Angular
Enfocado en
Nativo
Bello y personalizable
Un poderoso
CLI
Gran comunidad
Construido por NERDS (como tú)
Ionic Framework
Muéstrame el codigo
Manos a la obra
npm install -g cordova ionic
Instalamos ionic
//Nos basamos en un template
ionic start myApp blank
ionic start myApp tabs //para este ejemplo
ionic start myApp sidemenu
cd myApp
//Agregamos nuestras platformas
ionic platform add android
//Si quieres construir con sass (opcional)
ionic setup sass
//Para personalizar los iconos de tu app
ionic resources
Empezamos un proyecto
Agregamos Firebase
//Agregamos las librerías
ionic add firebase
ionic add angularfire
//Confirmamos
ionic list
//Ahora lo podemos correr
ionic serve
//Para ver el demo
ionic serve --lab
Ok bien
Se debe ver algo asi
Incluimos las librerias
<script src="lib/firebase/firebase.js"></script>
<script src="lib/angularfire/dist/angularfire.min.js"></script>
<script src="js/app.js"></script>
Antes del archivo app.js
La ruta
Este es el enlace entre nuestro controlador y vista
//la Ruta
.state('tab.todos', {
url: '/todos',
views: {
'tab-todos': {
templateUrl: 'templates/tab-todos.html',
controller: 'TodosCtrl' //Recuerdenlo
}
}
})
//Url por defecto
$urlRouterProvider.otherwise('/tab/todos');
La vista
Editamos las vistas (html)
//tabs.html
<ion-tab title="Tareas" icon="ion-checkmark" href="#/tab/todos">
<ion-nav-view name="tab-todos"></ion-nav-view>
</ion-tab>
//tab-dash.html => tab-todos.html
<ion-view view-title="Tareas">
<ion-content></ion-content>
</ion-view>
Necesitas iconos?
El controlador
//antes
.controller('DashCtrl', function($scope) {})
//Despues
.controller('TodosCtrl',[
'$scope',
function($scope){
console.log('hi!');
}
])
Resultado
Editamos nuestra Vista
<ion-view view-title="Tareas">
<ion-content>
<ion-list>
<ion-item class="todo item item-icon-left" ng-repeat="todo in todos">
<i class="icon ion-checkmark" ng-class="{'done': todo.done}"></i>
<h2>{{ todo.name }}</h2>
<p>{{ todo.text }}</p>
</ion-item>
</ion-list>
</ion-content>
</ion-view>
Recorremos una lista de tareas
Editamos nuestro Ctrl
Ponemos una lista de tareas de prueba
.controller('TodosCtrl',[
'$scope',
function($scope){
$scope.todos = [
{
name:'Tarea 1',
text : 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores odit incidunt beatae mollitia maiores error neque rem ipsa tenetur, sequi iste minima magnam, quis fuga! Quibusdam quo recusandae aut, aperiam.',
done: true,
},
{
name:'Tarea 2',
text : 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores odit incidunt beatae mollitia maiores error neque rem ipsa tenetur, sequi iste minima magnam, quis fuga! Quibusdam quo recusandae aut, aperiam.',
done: false,
},
];
}
])
Resultado
Variables por defecto
//El objeto
$scope.todo = {};
//La lista
$scope.todos = [];
//para editar o crear
$scope.is_new = true;
$ionicModal
Para el CRUD de la tarea ($ionicModal es un servicio)
$ionicModal.fromTemplateUrl('templates/todo-modal.html', {
scope: $scope,
animation: 'slide-in-up'
}).then(function(modal) {
$scope.modal = modal;
});
$scope.openModal = function() {
$scope.modal.show();
};
$scope.closeModal = function() {
$scope.modal.hide();
$scope.todo = {};
$scope.is_new = true;
};
Creamos el modal
Formulario para crear una tarea todo-modal.html
<ion-modal-view>
<ion-header-bar>
<h1 class="title">Tarea</h1>
<button class="button" ng-click="closeModal()">Cerrar</button>
</ion-header-bar>
<ion-content>
<form name="FormTodo" novalidate ng-submit="saveTodo()">
<div class="list">
<label class="item item-input item-stacked-label">
<span class="input-label">Nombre:</span>
<input type="text" ng-model="todo.name" required>
</label>
<label class="item item-input item-stacked-label">
<span class="input-label">Descripcion:</span>
<textarea rows="5" ng-model="todo.text" required></textarea>
</label>
<ion-toggle ng-model="todo.done" toggle-class="toggle-balanced">¿Hecho?</ion-toggle>
</div>
<div class="row">
<div class="col">
<button type="button" ng-show="!is_new" class="button button-block button-assertive" ng-click="deleteTodo()">Eliminar</button>
</div>
<div class="col">
<button type="submit" class="button button-block button-balanced" ng-disabled="FormTodo.$invalid">Guardar</button>
</div>
</div>
</form>
</ion-content>
</ion-modal-view>
Métodos para manejar el CRUD
Para el CRUD de la tarea
$scope.newTodo = function(){
$scope.openModal();
}
$scope.editTodo = function(index){
$scope.is_new = false;
$scope.todo = $scope.todos[index];
$scope.openModal();
}
$scope.addTodo = function(){
console.log('addTodo');
$scope.closeModal();
}
$scope.updateTodo = function(){
console.log('updateTodo');
$scope.closeModal();
}
$scope.deleteTodo = function(){
console.log('deleteTodo');
$scope.closeModal();
}
$scope.saveTodo = function(){
if($scope.is_new){
$scope.addTodo();
}else{
$scope.updateTodo();
}
}
Actualizamos la vista
Con las nuevas acciones tabs-todos.hmtl
<ion-view view-title="Tareas">
<ion-nav-buttons side="right">
<button class="button" ng-click="newTodo()">Nueva</button>
</ion-nav-buttons>
<ion-content>
<ion-list>
<ion-item class="todo item item-icon-left" ng-repeat="todo in todos" ng-click="editTodo($index)">
<i class="icon ion-checkmark" ng-class="{'done': todo.done}"></i>
<h2>{{ todo.name }}</h2>
<p>{{ todo.text }}</p>
</ion-item>
</ion-list>
</ion-content>
</ion-view>
Respiramos
Ahora vamos con crear nuestra base de datos en firebase
Añadimos firebase como dependecia
angular.module('starter', [
'ionic',
'firebase',
'starter.controllers',
'starter.services'
])
Archivo app.js
Básico de angularfire
//Referencia a nuestra base de datos
var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/");
Dos tipos de respuesta: Object o Array
var myObject = $firebaseObject(ref);
var myCollection = $firebaseArray(ref);
$firebaseObject y $firebaseArray deben ser tratados como servicios en angular
Creamos nuestro Servicio
.factory('TodoFirebase',[
'$firebaseArray','$firebaseObject',
function($firebaseArray, $firebaseObject) {
return {
//retorna la referencia a la base de datos 'todos'
allRef: function(){
return new Firebase('https://todo-ionic-101.firebaseio.com/todos');
},
//La referencia la retorna como un array de firebase
all: function(){
return $firebaseArray(this.allRef());
},
//retorna la referencia a un objeto 'todo'
getRef: function(id){
return new Firebase('https://todo-ionic-101.firebaseio.com/todos/' + id);
},
//La referencia la retorna como un objeto de firebase
get: function(id){
return $firebaseObject(this.getRef(id));
}
};
}
])
Metodos de Firebase Crud
//Obtener las Tareas
$scope.todos = TodoFirebase.all();
//Crear Tarea
$scope.addTodo = function(){
console.log('addTodo');
$scope.todos.$add({
name: $scope.todo.name,
text: $scope.todo.text,
done: $scope.todo.done || false
});
$scope.closeModal();
}
//Actualizar Tarea
$scope.updateTodo = function(){}
console.log('updateTodo');
var todo = TodoFirebase.getRef($scope.todo.$id);
todo.update({
name: $scope.todo.name,
text: $scope.todo.text,
done: $scope.todo.done || false
});
$scope.closeModal();
}
//Eliminar Tarea
$scope.deleteTodo = function(){
console.log('deleteTodo');
var todo = TodoFirebase.getRef($scope.todo.$id);
todo.remove();
$scope.closeModal();
}
Controlador
.controller('TodosCtrl',[
'$scope','$ionicModal','TodoFirebase',
function($scope, $ionicModal, TodoFirebase){
$scope.todo = {};
$scope.todos = TodoFirebase.all();
$scope.is_new = true;
$ionicModal.fromTemplateUrl('templates/todo-modal.html', {
scope: $scope,
animation: 'slide-in-up'
}).then(function(modal) {
$scope.modal = modal;
});
$scope.openModal = function() {
$scope.modal.show();
};
$scope.closeModal = function() {
$scope.modal.hide();
$scope.todo = {};
$scope.is_new = true;
};
$scope.newTodo = function(){
$scope.openModal();
}
$scope.editTodo = function(index){
$scope.is_new = false;
$scope.todo = $scope.todos[index];
$scope.openModal();
}
$scope.addTodo = function(){
console.log('addTodo');
$scope.todos.$add({
name: $scope.todo.name,
text: $scope.todo.text,
done: $scope.todo.done || false
});
$scope.closeModal();
}
$scope.updateTodo = function(){
console.log('updateTodo');
var todo = TodoFirebase.getRef($scope.todo.$id);
todo.update({
name: $scope.todo.name,
text: $scope.todo.text,
done: $scope.todo.done || false
});
$scope.closeModal();
}
$scope.deleteTodo = function(){
console.log('deleteTodo');
var todo = TodoFirebase.getRef($scope.todo.$id);
todo.remove();
$scope.closeModal();
}
$scope.saveTodo = function(){
if($scope.is_new){
$scope.addTodo();
}else{
$scope.updateTodo();
}
}
}
])
LISTO!!
Leer Varios Eventos
ref.on("child_added", function(snapshot, prevChildKey) {
var newPost = snapshot.val();
console.log("Author: " + newPost.author);
console.log("Title: " + newPost.title);
console.log("Previous Post ID: " + prevChildKey);
});
ref.on("child_changed", function(snapshot) {
var changedPost = snapshot.val();
console.log("The updated post title is " + changedPost.title);
});
ref.on("child_removed", function(snapshot) {
var deletedPost = snapshot.val();
console.log("The blog post titled '" + deletedPost.title + "' has been deleted");
});
Ahora solo es construir la app
ionic build
ionic upload
ionic share
¿Offline?
¿Preguntas?
Ahora si el refrigerio
Prestación basada en
Ionicframework + Firebase
By Nicolas Molina
Ionicframework + Firebase
Aprende a trabajar con estas dos increíbles tecnologías para desarrollar tu aplicación móvil. Conocerás cómo integrar bases de datos NoSql con firebase, haciendo que tu aplicación tenga conexión en tiempo real con tus datos.
- 2,820