SlideShare a Scribd company logo
1 of 30
Download to read offline
App Engine 

i Play Services
Jacek Kwiecień
Schibsted Tech Polska
Zastosowania praktyczne
App Engine
https://cloud.google.com/appengine/docs
Platforma developerska hostująca aplikacje webowe w
centrach danych Google
Po co mi App Engine?
Dodawanie modułu Google Cloud do naszej aplikacji
Inne zalety zastosowania App Engine
• Automatycznie skalowalny
• Automatycznie generowane api dla aplikacji klienckiej
Android (obsługa również dla iOS)
• Możliwość wykorzystania końcówek jako klasyczne rest api
• Brak konieczności posiadania lub wynajmowania osobnego
serwera - zerowe koszty wejścia
• Do niewielkiego wykorzystania zupełnie darmowy, później
koszt jest zależny od zużycia
• Możliwość tworzenia w Python, Java, PHP i Go
Słabe strony App Engine
• Datastore jest bardzo ograniczony w stosunku do SQL
• Pierwszy deploy potrafi nastręczyć sporo problemów

(Stackoverflow na ratunek)
• Społeczność nie jest tak liczna jak dla innych popularnych
rozwiązań backendowych
• Źle zaprojektowana aplikacja o dużym zapotrzebowaniu

może pochłonąć majątek
• Brak możliwości zwracania podstawowych obiektów
odzwierciedlających typy proste
Tworzenie końcówek (endpoints)
Backend
Android Client
private class UserInfo {

public String nameAndAge;

}



@ApiMethod(name = "userInfo")

public UserInfo userInfo(@Named("name") String name, @Named("age") Integer age) {

UserInfo info = new UserInfo();

info.nameAndAge = String.format("%s, age: %d", name, age);

return info;

}
private void getUserInfo() throws IOException {

Publicapi.Builder builder = new Publicapi.Builder(

AndroidHttp.newCompatibleTransport(),

new JacksonFactory(),

null)

.setApplicationName("Test app");

builder = CloudEndpointUtils.updateBuilder(builder);

Publicapi endpoint = builder.build();



UserInfo info = endpoint.userInfo("Jacek", 29).execute();

Log.i("User", info.getNameAndAge());

}
Datastore
https://cloud.google.com/datastore/docs
Zintegrowana z App Engine baza danych typu no-SQL
Objectify
Biblioteka znacznie ułatwiająca pracę z Datastore.
@Entity

public class Invitation {



@Id

protected String id;

@Index

private String inviterId;

@Index

private String inviteeId;

@Index

private boolean pending;

@Index

private boolean accepted;

@Index

private Date createdAt;

@Index

private Date answeredAt;

}
Encja - klasa definiująca „tabelę”
Kwerendy
@ApiMethod(name = "invitations")

public RInvitations invitations(@Named("inviteeId") String inviteeId, @Named("from")
Date from) {

List<Invitation> invitations = ofy().load().type(Invitation.class)

.filter("inviteeId", inviteeId).filter("pending", true)

.filter("createdAt >", from).list();

RInvitations response = RInvitations.newInstance(invitations);

return response;

}
in, =, ==
Operatory równości:
>, >=, <, <=, in, !=
Operatory nierówności:
Bulkloader
Narzędzie pozwalające na upload dużych paczek
danych bezpośrednio z plików CSV do Datastore.
https://cloud.google.com/appengine/docs/adminconsole/datastoreadmin
appcfg.py upload_data --config_file bulkloader.yaml --url=https://quiz-
fight.appspot.com/remote_api --filename question.csv --kind=Question -e
jacek.kwiecien@gmail.com
Najlepiej do tego celu używać Google Docs!
python_preamble:
- import: base64
- import: re
- import: google.appengine.ext.bulkload.transform
- import: google.appengine.ext.bulkload.bulkloader_wizard
- import: google.appengine.ext.db
- import: google.appengine.api.datastore
transformers:
- kind: Question
connector: csv
connector_options:
encoding: utf-8
property_map:
- property: __key__
external_name: id
export_transform: transform.key_id_or_name_as_string
import_transform: transform.none_if_empty(int)
- property: subcategoryId
external_name: subcategoryId
export_transform: transform.key_id_or_name_as_string
import_transform: transform.none_if_empty(int)
- property: question
external_name: question
Konsola developerska
• Wiele przydatnych i nieprzydatnych informacji (w tym
statystyki użycia i logi)
• Możliwość przeglądania i edycji Datastore
• Aktywacja poszczególnych API Google (np do celów
integracji z Google+ lub Youtube)
• Wgląd w kod źródłowy aplikacji oraz push-to-deploy
• Kreator okna dostępu
• Wiele, wiele innych…
Udzielanie dostępu aplikacjom klienckim
Wyświetlenie danych o kluczach w pliku keystore: keytool -list -v -keystore <sciezka_pliku>
Wyświetlenie danych o pliku apk: keytool -list -printcert -jarfile <sciezka_apk>
Przykłady zastosowania Google API
Logowanie z Google+
https://developers.google.com/+/mobile/android/sign-in
GoogleApiClient.Builder(context).addConnectionCallbacks(connectionCallbacksListener)
.addOnConnectionFailedListener(connectionFailedListener)
.addApi(Plus.API).addScope(Plus.SCOPE_PLUS_LOGIN).build();
Benefity korzystania z API Google+
Play Games
https://developers.google.com/games/services/
GoogleApiClient.Builder(context).addConnectionCallbacks(connectionCallbacksListener)
.addOnConnectionFailedListener(connectionFailedListener)
.addApi(Games.API).addScope(Games.SCOPE_GAMES).build();
Play Games
Tabele wyników
Osiągnięcia
Questy i Eventy
Multiplayer
(turowy i w czasie
rzeczywistym)
Zapis gry
Zabezpieczenie 

antypirackie
Tabele wyników
https://developers.google.com/games/services/common/concepts/leaderboards
Aktualizowanie wyniku gracza
Games.Leaderboards.loadCurrentPlayerLeaderboardScore(

googleApiClient,

LEADERBOARD_ID,

LeaderboardVariant.TIME_SPAN_ALL_TIME,

LeaderboardVariant.COLLECTION_PUBLIC)

.setResultCallback(new ResultCallback<Leaderboards.LoadPlayerScoreResult>() {

@Override

public void onResult(final Leaderboards.LoadPlayerScoreResult scoreResult) {

if (isScoreResultValid(scoreResult)) {

long currentPoints = scoreResult.getScore().getRawScore();

long pointsToAdd = 1337;

Games.Leaderboards.submitScore(googleApiClient, LEADERBOARD_ID, currentPoints +
pointsToAdd);

}

}

});
Tabele wyników
https://developers.google.com/games/services/common/concepts/leaderboards
Wyświetlanie tabeli
startActivityForResult(

Games.Leaderboards.getLeaderboardIntent(googleApiClient, LEADERBOARD_ID), 

REQUEST_LEADERBOARD);
Osiągnięcia
https://developers.google.com/games/services/common/concepts/achievements
Odblokowywanie osiągnięć:
Games.Achievements.unlock(
googleApiClient,
"my_achievement_id");
Games.Achievements.increment(

googleApiClient, 

"my_incremental_achievment_id", 

1);
Wyświetlanie osiągnięć:
startActivityForResult(

Games.Achievements

.getAchievementsIntent(googleApiClient),

REQUEST_ACHIEVEMENTS);
Multiplayer (turowy i w czasie rzeczywistym)
https://developers.google.com/games/services/common/concepts/realtimeMultiplayer
• System pokojów
• Szereg callbacków obsługujących zdarzenia w grze
• UI do zapraszania znajomych oraz oczekiwania na start gry
• Przesyłanie informacji pomiędzy uczestnikami 

(reliable i non-reliable)
• Brak konieczności posiadania backendu dla prostych 

gier
Przykłady
Game of Words Quiz Fight
Sorry for the long presentation… here is the
potato
http://tnijurl.com/mtcae/
Prezentacja dostępna pod

More Related Content

Similar to Google App Engine i Google Play Services w Twoich aplikacjach

WordUp Kraków - maj 2015
WordUp Kraków - maj 2015WordUp Kraków - maj 2015
WordUp Kraków - maj 2015
Tomasz Dziuda
 

Similar to Google App Engine i Google Play Services w Twoich aplikacjach (20)

Joomla Day Poland 15 - Docker
Joomla Day Poland 15 - DockerJoomla Day Poland 15 - Docker
Joomla Day Poland 15 - Docker
 
WP-API - teoria i praktyka - WordUp Trójmiasto #2
WP-API - teoria i praktyka - WordUp Trójmiasto #2WP-API - teoria i praktyka - WordUp Trójmiasto #2
WP-API - teoria i praktyka - WordUp Trójmiasto #2
 
Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?
Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?
Dlaczego Twoja kolejna aplikacja powinna bazować na platformie Drupal?
 
WP-API - teoria i praktyka - WordUp Łódź #4
WP-API - teoria i praktyka - WordUp Łódź #4WP-API - teoria i praktyka - WordUp Łódź #4
WP-API - teoria i praktyka - WordUp Łódź #4
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Testy funkcjonalne
Testy funkcjonalneTesty funkcjonalne
Testy funkcjonalne
 
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
Jak zarabiać na testowaniu oprogramowania(konferencja MeeTTech Piła 27.07.2016)
 
HYC - Angular stań się kanciastym
HYC - Angular stań się kanciastymHYC - Angular stań się kanciastym
HYC - Angular stań się kanciastym
 
Wydajny frontend 2023
Wydajny frontend 2023Wydajny frontend 2023
Wydajny frontend 2023
 
Encje w drupalu - DrupalCamp Wroclaw 2015
Encje w drupalu - DrupalCamp Wroclaw 2015Encje w drupalu - DrupalCamp Wroclaw 2015
Encje w drupalu - DrupalCamp Wroclaw 2015
 
WordUp Kraków - maj 2015
WordUp Kraków - maj 2015WordUp Kraków - maj 2015
WordUp Kraków - maj 2015
 
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
 
Word up łódź kwiecień 2015
Word up łódź   kwiecień 2015Word up łódź   kwiecień 2015
Word up łódź kwiecień 2015
 
Najlepsze wtyczki WordPress, które każdy developer powinien mieć
Najlepsze wtyczki WordPress, które każdy developer powinien miećNajlepsze wtyczki WordPress, które każdy developer powinien mieć
Najlepsze wtyczki WordPress, które każdy developer powinien mieć
 
OSGi, deklaratywnie
OSGi, deklaratywnieOSGi, deklaratywnie
OSGi, deklaratywnie
 
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław SobieckiPodstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
Podstawy programowania w Drupalu - Drupal idzie na studia - Jarosław Sobiecki
 
Optimizing Drupal Performance (Polish)
Optimizing Drupal Performance (Polish)Optimizing Drupal Performance (Polish)
Optimizing Drupal Performance (Polish)
 
Dobre przepisy na cake php
Dobre przepisy na cake phpDobre przepisy na cake php
Dobre przepisy na cake php
 
Wprowadzenie do WP-API
Wprowadzenie do WP-APIWprowadzenie do WP-API
Wprowadzenie do WP-API
 
SQL Day 2018 Building efficient and reliable Enterprise Reporting Platform wi...
SQL Day 2018 Building efficient and reliable Enterprise Reporting Platform wi...SQL Day 2018 Building efficient and reliable Enterprise Reporting Platform wi...
SQL Day 2018 Building efficient and reliable Enterprise Reporting Platform wi...
 

More from 3camp

Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model
3camp
 

More from 3camp (20)

Jak udokumentować bazę danych
Jak udokumentować bazę danychJak udokumentować bazę danych
Jak udokumentować bazę danych
 
ORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowaniaORM - tuningujemy podejście do mapowania
ORM - tuningujemy podejście do mapowania
 
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
No pressure, no diamonds. Rzecz o łamaniu zasad w projektach.
 
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
W poszukiwaniu procesu doskonałego. Wdrożenie Scruma, Continuous Integrations...
 
Wykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie AndroidWykorzystanie języka Kotlin do aplikacji na platformie Android
Wykorzystanie języka Kotlin do aplikacji na platformie Android
 
Learn you some rx for the greater good
Learn you some rx for the greater goodLearn you some rx for the greater good
Learn you some rx for the greater good
 
Reakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyceReakcja łańcuchowa, czyli React.js w praktyce
Reakcja łańcuchowa, czyli React.js w praktyce
 
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
Odtwarzanie multimediów w HTML5, czyli Player przez duże „P”
 
AngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektuAngularJS (nie) nadaje się do dużego projektu
AngularJS (nie) nadaje się do dużego projektu
 
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
Przemysław Bartkowiak - Sam ustalasz ile za to zapłacisz – czyli nowy wymiar ...
 
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
Mirek Wąsowicz - Segment jednego, dokąd zmierza marketing online?
 
Artur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupachArtur Senk, OKE Poland, Big Data na zakupach
Artur Senk, OKE Poland, Big Data na zakupach
 
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
Piotr Macuk, Konfeo.com, Programista i biznes – plusy i minusy własnej działa...
 
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnieMarcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
Marcin Maj, Kainos - QA – wartko, zmiennie i interdyscyplinarnie
 
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
Jak przesiąść się na rower na dwóch kółkach? Od trzyosobowego startupu do spó...
 
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
Łukasz Brzeziński - Jak zarabiać z Wikingami? Czyli monetyzacja portalu inter...
 
Marcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk ModelMarcin Szeląg, InnovationNest, Startup Risk Model
Marcin Szeląg, InnovationNest, Startup Risk Model
 
JSON, REST API
JSON, REST APIJSON, REST API
JSON, REST API
 
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanieOstatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
Ostatnia faza produktu: co się dzieję kiedy programista zakończył swoje zadanie
 
Oculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłośćOculus Rift – zanurzenie w przyszłość
Oculus Rift – zanurzenie w przyszłość
 

Google App Engine i Google Play Services w Twoich aplikacjach