Slide 1

Slide 1 text

Apps realtime com Firebase

Slide 2

Slide 2 text

Jean Pimentel Product Engineer na CI&T Desenvolvedor mobile há 2 anos Leitor de ficção científica Co-organizador do Android Meetup BH e CocoaHeads BH

Slide 3

Slide 3 text

Firebase

Slide 4

Slide 4 text

Backend as a Service

Slide 5

Slide 5 text

Hosting User Authentication Realtime Database

Slide 6

Slide 6 text

Comunicação em tempo real entrega muito valor ao usuário. Essencial hoje em dia!

Slide 7

Slide 7 text

Realtime Database pronto pra usar

Slide 8

Slide 8 text

AngularJS, Ember, ReactJS, Ionic, Backbone.js JavaScript Android iOS Java, Ruby, Python, Go, PHP, C# REST

Slide 9

Slide 9 text

Baseado principalmente em: - Conexões simultâneas - Quantidade de dados armazenados - Quantidade de tráfego Firebase | Custos

Slide 10

Slide 10 text

Firebase Dados

Slide 11

Slide 11 text

Seu conhecimento em SQL? Esqueça!

Slide 12

Slide 12 text

JSON Tree DICAS: Saiba como os dados serão lidos. Aninhe dados com moderação. Desnormalize!

Slide 13

Slide 13 text

JSON Tree LIMITES: Profundidade máxima de 32 nós. Tamanho de um filho não pode passar de 10MB

Slide 14

Slide 14 text

Smart Canvas

Slide 15

Slide 15 text

Inspire your teams to tear down silos.

Slide 16

Slide 16 text

Smart Canvas

Slide 17

Slide 17 text

Smart Canvas | Usos Novos conteúdos Histórico de buscas Contadores de Likes, Pins, Bookmarks Presença

Slide 18

Slide 18 text

Smart Canvas | Usos Novos conteúdos

Slide 19

Slide 19 text

Smart Canvas | Usos Firebase ref = new Firebase( "https://foo.com/tenants/ciandt/users//stream/lastUpdate" ); ValueEventListener listener = new ValueEventListener() { .. } // onResume ref.addValueEventListener(listener); // onPause ref.removeEventListener(listener);

Slide 20

Slide 20 text

Smart Canvas | Usos ValueEventListener listener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { System.out.println(snapshot.getValue()); } @Override public void onCancelled(FirebaseError firebaseError) { System.out.println(firebaseError.getMessage()); } }

Slide 21

Slide 21 text

Smart Canvas | Usos Histórico de buscas

Slide 22

Slide 22 text

Smart Canvas | Usos Firebase ref = new Firebase( "https://foo.com/tenants/ciandt/users//searches" ); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { for (DataSnapshot child: snapshot.getChildren()) { System.out.println(child("query").getValue()); } } });

Slide 23

Slide 23 text

Smart Canvas | Usos Contadores de Likes, Pins, Bookmarks

Slide 24

Slide 24 text

Smart Canvas | Usos Firebase ref = new Firebase( "https://foo.com/tenants/ciandt/posts//statistics" ); ValueEventListener listener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { System.out.println(snapshot.child("likes").getValue()); System.out.println(snapshot.child("bookmarks").getValue()); System.out.println(snapshot.child("pins").getValue()); } }

Slide 25

Slide 25 text

Smart Canvas | Usos Presença

Slide 26

Slide 26 text

Smart Canvas | Usos Firebase ref = new Firebase( "https://foo.com/tenants/ciandt/presence/|" ); ChildEventListener listener = new ChildEventListener() { .. } // onResume ref.addChildEventListener(listener); // onPause ref.removeEventListener(listener);

Slide 27

Slide 27 text

Smart Canvas | Usos ChildEventListener listener = new ChildEventListener() { @Override public void onChildAdded(DataSnapshot snapshot, String previousChildKey) { // ... } @Override public void onChildRemoved(DataSnapshot snapshot) { // ... } }

Slide 28

Slide 28 text

Smart Canvas | Usos // send presence Firebase ref = new Firebase( "https://foo.com/tenants/ciandt/presence/|" ); Map info = new HashMap(); info.put("avatar", "http://foo.bar/img.jpg"); info.put("name", "Jean Pimentel"); ref.child("jpimentel").setValue(info);

Slide 29

Slide 29 text

Smart Canvas | Usos // send presence Firebase ref = … public class User { private String avatar; private String name; public User() {} public User(String avatar, int name) { .. } public String getAvatar() { return avatar; } public String getName() { return name; } } User user = new User("http://foo.bar/img.jpg", "Jean Pimentel"); ref.child("jpimentel").setValue(user);

Slide 30

Slide 30 text

Smart Canvas | Usos Outros métodos - setValue() - updateChildren() - push() - runTransaction()

Slide 31

Slide 31 text

Firebase Queries

Slide 32

Slide 32 text

Firebase | Ordenação - orderByKey() - orderByValue() - orderByChild("") - orderByPriority()

Slide 33

Slide 33 text

Firebase | Ordenação - limitToFirst(n) - limitToLast(n) - startAt(n) - endAt(n) - equalTo()

Slide 34

Slide 34 text

Firebase | Ordenação Query queryRef = ref.orderByChild("age").limitToFirst(5); queryRef.addChildEventListener(new ChildEventListener() { // ... }); Query queryRef = ref.orderByValue().limitToLast(3); queryRef.addChildEventListener(new ChildEventListener() { // ... });

Slide 35

Slide 35 text

Firebase Autenticação

Slide 36

Slide 36 text

Firebase | Autenticação Login/Senha OAuth (Google, GitHub, Facebook, Twitter) Guest Custom - JSON Web Tokens (JWT)

Slide 37

Slide 37 text

Firebase | Autenticação .authWithPassword("", "", /* handler */) .authWithOAuthToken("", "", /* handler */) .authAnonymously(/* handler */) .authWithCustomToken("", /* handler */)

Slide 38

Slide 38 text

Firebase | Autenticação Firebase ref = new Firebase("https://foo.firebaseio.com/"); ref.authWithCustomToken(, new Firebase.AuthResultHandler() { @Override public void onAuthenticationError(FirebaseError error) { System.err.println("Login Failed! " + error.getMessage()); } @Override public void onAuthenticated(AuthData authData) { System.out.println("Login Succeeded!"); } });

Slide 39

Slide 39 text

Firebase Autorização

Slide 40

Slide 40 text

Firebase | Autorização Linguagem declarativa, que resulta em V ou F { "rules": { ".read": true, ".write": false } }

Slide 41

Slide 41 text

Firebase | Autorização { "rules": { ".write": "false", "tenants": { "$tenant": { "presence": { ".read": "auth != null && auth.tenant === $tenant", ".write": "auth != null && auth.tenant === $tenant" }, "$other": { ".read": "true", ".write": "false" } } } } }

Slide 42

Slide 42 text

Firebase | Autorização { "rules": { ".write": "false", "tenants": { "$tenant": { "presence": { ".read": "auth != null && auth.tenant === $tenant", ".write": "auth != null && auth.tenant === $tenant" ".validate": "newData.hasChildren(['avatar', 'name'])" } } } } }

Slide 43

Slide 43 text

Firebase Backups

Slide 44

Slide 44 text

Backups Google Cloud Storage ou Amazon S3 Pode ser habilitado em alguns planos Não contabiliza a transferência de dados

Slide 45

Slide 45 text

Backups Google Cloud Storage ou Amazon S3 Pode ser habilitado em alguns planos Não contabiliza a transferência de dados REST API Limite de 200MB por vez Contabiliza a transferência de dados

Slide 46

Slide 46 text

Obrigado!