Google App Engine i Google Play Services w Twoich aplikacjach

30
App Engine i Play Services Jacek Kwiecień Schibsted Tech Polska Zastosowania praktyczne

Transcript of Google App Engine i Google Play Services w Twoich aplikacjach

Page 1: Google App Engine i Google Play Services w Twoich aplikacjach

App Engine i Play Services

Jacek Kwiecień Schibsted Tech Polska

Zastosowania praktyczne

Page 2: Google App Engine i Google Play Services w Twoich aplikacjach
Page 3: Google App Engine i Google Play Services w Twoich aplikacjach

App Engine

https://cloud.google.com/appengine/docs

Platforma developerska hostująca aplikacje webowe w centrach danych Google

Page 4: Google App Engine i Google Play Services w Twoich aplikacjach

Po co mi App Engine?

Page 5: Google App Engine i Google Play Services w Twoich aplikacjach

Dodawanie modułu Google Cloud do naszej aplikacji

Page 6: Google App Engine i Google Play Services w Twoich aplikacjach
Page 7: Google App Engine i Google Play Services w Twoich aplikacjach

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

Page 8: Google App Engine i Google Play Services w Twoich aplikacjach

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

Page 9: Google App Engine i Google Play Services w Twoich aplikacjach

Tworzenie końcówek (endpoints)

Page 10: Google App Engine i Google Play Services w Twoich aplikacjach

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()); }

Page 11: Google App Engine i Google Play Services w Twoich aplikacjach

Datastore

https://cloud.google.com/datastore/docs

Zintegrowana z App Engine baza danych typu no-SQL

Page 12: Google App Engine i Google Play Services w Twoich aplikacjach

ObjectifyBiblioteka znacznie ułatwiająca pracę z Datastore.

Page 13: Google App Engine i Google Play Services w Twoich aplikacjach

@Entitypublic 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ę”

Page 14: Google App Engine i Google Play Services w Twoich aplikacjach
Page 15: Google App Engine i Google Play Services w Twoich aplikacjach

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:

Page 16: Google App Engine i Google Play Services w Twoich aplikacjach

BulkloaderNarzę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 [email protected]

Najlepiej do tego celu używać Google Docs!

Page 17: Google App Engine i Google Play Services w Twoich aplikacjach

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

Page 18: Google App Engine i Google Play Services w Twoich aplikacjach

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…

Page 19: Google App Engine i Google Play Services w Twoich aplikacjach

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>

Page 20: Google App Engine i Google Play Services w Twoich aplikacjach

Przykłady zastosowania Google API

Page 21: Google App Engine i Google Play Services w Twoich aplikacjach

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();

Page 22: Google App Engine i Google Play Services w Twoich aplikacjach

Benefity korzystania z API Google+

Page 23: Google App Engine i Google Play Services w Twoich aplikacjach

Play Gameshttps://developers.google.com/games/services/

GoogleApiClient.Builder(context).addConnectionCallbacks(connectionCallbacksListener) .addOnConnectionFailedListener(connectionFailedListener) .addApi(Games.API).addScope(Games.SCOPE_GAMES).build();

Page 24: Google App Engine i Google Play Services w Twoich aplikacjach

Play Games

Tabele wyników

Osiągnięcia

Questy i Eventy

Multiplayer (turowy i w czasie rzeczywistym)

Zapis gry

Zabezpieczenie antypirackie

Page 25: Google App Engine i Google Play Services w Twoich aplikacjach

Tabele wynikówhttps://developers.google.com/games/services/common/concepts/leaderboards

Aktualizowanie wyniku graczaGames.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); } }});

Page 26: Google App Engine i Google Play Services w Twoich aplikacjach

Tabele wynikówhttps://developers.google.com/games/services/common/concepts/leaderboards

Wyświetlanie tabelistartActivityForResult( Games.Leaderboards.getLeaderboardIntent(googleApiClient, LEADERBOARD_ID), REQUEST_LEADERBOARD);

Page 27: Google App Engine i Google Play Services w Twoich aplikacjach

Osiągnięciahttps://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);

Page 28: Google App Engine i Google Play Services w Twoich aplikacjach

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

Page 30: Google App Engine i Google Play Services w Twoich aplikacjach

Sorry for the long presentation… here is the potato

http://tnijurl.com/mtcae/Prezentacja dostępna pod