workshop: building your mobile backend with parse - droidcon paris2014

Post on 13-Jun-2015

247 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

http://fr.droidcon.com/2014/agenda/detail?title=Parse+Worskshop Learn how to focus on creating a great user experience and forget complex infrastructure. Instantly add a powerful core, push notifications, and analytics to your app with Parse. We will take a deep dive at Parse's native SDKs for Android and see how to build an app that scales to millions of users. Speaker: Ali Parr, Parse Head of Mobile Platform Partnerships Engineering, EMEA, Facebook and Parse, based in London. He currently heads up the Parse partnerships program for Facebook in EMEA, as well focusing on new developer acquisition. Ali is focused on building partnerships between Parse and developers across EMEA, through direct contact, public speaking opportunities, and mentoring events. Ali is also a mentor at Techstars in London, and The Family in Paris, providing advice and experience to high-potential startups. Prior to Facebook, Ali was the founder of Infinite Degree, a gaming startup that reached top 10 in Apple App Store across many regions including the US and the UK. Ali holds a Masters degree in Computer Science.

TRANSCRIPT

BUILDING YOUR MOBILE BACKEND WITH PARSE

ALI PARR PLATFORM PARTNERSHIPS

IDENTITYSHARING

PUSH NOTIFICATIONSAPP INSTALLSMONETIZATION

IDENTITYSHARINGPUSH NOTIFICATIONSAPP INSTALLSMONETIZATION

CORE API STABILITY GUARANTEE

2 YEAR

VERSIONINGFOR ALL APIs

MAJOR BUG FIX SLA

48 HOUR

BUILD GROW

App Installs

Sharing

Messaging

MONETIZE

Payments

Audience Network

Parse

Login

App Events

App Links

PHYSICAL SERVERSLOAD BALANCINGDATABASE BINDINGS

RESTful APIROUTING

MIDDLEWARE

APP SECURITY

APP BUSINESS LOGIC

NETWORKING

CACHING

DATA MODELS

USER SESSIONSSOCIAL

PUSH NOTIFICATIONSFILESUI BINDINGS

PHYSICAL SERVERSLOAD BALANCINGDATABASE BINDINGS

RESTful APIROUTING

MIDDLEWARE

APP SECURITY

APP BUSINESS LOGIC

NETWORKING

CACHING

DATA MODELS

USER SESSIONSSOCIAL

PUSH NOTIFICATIONSFILESUI BINDINGS

YOUR APP

PARSE

YOUR APP

Parse Core Parse Push Parse Analytics

Completely Open Source

PARSE CORE

Your backend in the cloud

Save data to and fetch data from Parse

Run custom app code on Parse’s servers

Easily create and manage user accounts and sessions

THE F8 APP

THE F8 APP

Key Value

TitleEverything You Need to Know About

Login

Time 12:30

Speaker Eddie O’Neil

isFavorite FALSE

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SAVING TO PARSEParseObject talk = new ParseObject(”Talk”);

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SAVING TO PARSE

talk.put(“title”, “Opening Keynote”);talk.put(“speaker”, “Mark Zuckerberg”);talk.put(“time”, talkDate); // Datetalk.put(“isFavorite”, false);

ParseObject talk = new ParseObject(”Talk”);

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SAVING TO PARSE

talk.saveInBackground();

talk.put(“title”, “Opening Keynote”);talk.put(“speaker”, “Mark Zuckerberg”);talk.put(“time”, talkDate); // Datetalk.put(“isFavorite”, false);

ParseObject talk = new ParseObject(”Talk”);

DEMO TIME!

PARSE QUERYParseQuery<ParseObject> query = ParseQuery.getQuery(”Talk”);

query.findInBackground(new FindCallback<ParseObject>(){ public void done(List<ParseObject> buildTalks, ParseException e) {

if (e == null) { // We have a list of all the Build track talks } else { // Something went wrong; check the ParseException } }

// Find only the talks that are in the Build track query.whereEqualTo(”track”,”Build”);

PARSE QUERY

}

ParseQuery<ParseObject> query = ParseQuery.getQuery(”Talk”);

query.findInBackground(new FindCallback<ParseObject>(){ public void done(List<ParseObject> buildTalks, ParseException e) {

if (e == null) { // We have a list of all the Build track talks } else { // Something went wrong; check the ParseException } }

// Find only the talks that are in the Build track query.whereEqualTo(”track”,”Build”);

PARSE SOCIAL

Easy User & Session Management

Sign up Improve app

security with ACLsManage user session with “currentUser”

Create Roles Log in & add 3rd party auth

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SIGN UP A PERSON

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SIGN UP A PERSONParseUser user = new ParseUser();user.setUsername(”janedoe”);user.setPassword(”mypass123”);user.setEmail(”janedoe@fb.com”);user.signUpInBackground();

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

LOG A PERSON IN

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

LOG A PERSON INParseUser.logInInBackground( ”janedoe”,

”mypass123”, new LogInCallback() {public void done(ParseUser user, ParseException e) {

if (user != null) {// The user is logged in

} else {// Something went wrong; check the ParseException

}}

});

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SAVING TO PARSE WITH A CURRENT USERParseObject post = new ParseObject(”Post”);

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SAVING TO PARSE WITH A CURRENT USER

post.put(“title”, “Restrict screen orientation”);post.put(“author”, ParseUser.getCurrentUser());post.put(“topic”, “Android”);post.put(“content”, ”How can I make my app work in portrait

orientation only?”);

ParseObject post = new ParseObject(”Post”);

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

SAVING TO PARSE WITH A CURRENT USER

post.saveInBackground();

// This post is now saved with an ACL; the default is// public read, writes only by the user that saved it

post.put(“title”, “Restrict screen orientation”);post.put(“author”, ParseUser.getCurrentUser());post.put(“topic”, “Android”);post.put(“content”, ”How can I make my app work in portrait

orientation only?”);

ParseObject post = new ParseObject(”Post”);

SAVE A FILEbyte[] data = myPhotoObject.toByteArray();

SAVE A FILE

ParseFile speakerPhoto = new ParseFile(”hector_bw.jpg”, data);speakerPhoto.saveInBackground();

byte[] data = myPhotoObject.toByteArray();

SAVE A FILE

ParseFile speakerPhoto = new ParseFile(”hector_bw.jpg”, data);speakerPhoto.saveInBackground();

ParseObject speaker = new ParseObject(”Speaker”);picture.put(”name”, ”Héctor Ramos”);picture.put(”photo”, speakerPhoto);picture.saveInBackground();

byte[] data = myPhotoObject.toByteArray();

SAVE A FILE

ParseFile speakerPhoto = new ParseFile(”hector_bw.jpg”, data);speakerPhoto.saveInBackground();

ParseObject speaker = new ParseObject(”Speaker”);picture.put(”name”, ”Héctor Ramos”);picture.put(”photo”, speakerPhoto);picture.saveInBackground();

byte[] data = myPhotoObject.toByteArray();

CLOUD CODE

Run custom app code in Parse’s cloud

Run code when objects are saved or deleted

Create custom functions and web hooks

Schedule long-running jobs with Background Jobs

CLOUD MODULES

Easy third-party integration with pre-built modules

Send email Take payments Add SMS to your

app Connect with any RESTful service

using Parse.Cloud.httpRequest

BACKGROUND JOBS

Schedule long-running jobs

For operations that need to be performed regularly

or on command

Longer timeouts— 15 minutes

Trigger from the web UI or REST endpoint

BACKGROUND JOBS

Schedule long-running jobs

For operations that need to be performed regularly

or on command

Longer timeouts— 15 minutes

Trigger from the web UI or REST endpoint

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

A SIMPLE JOB

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

A SIMPLE JOBParse.Cloud.job(”lowercaseallthethings”, function (request, status) {

// Set up to modify user dataParse.Cloud.useMasterKey();

// Query for all usersvar query = new Parse.Query(Parse.User);query.each(function(user) {

// Set and save the changeuser.set(”name”, user.name.toLowerCase());return user.save();

}).then(function() {// Set the job’s success and error statuses

status.success(”All users now have lowercase names”);}, function(error) {

status.error(”Job did not complete.”);});

}

Parse Local Datastore

Parse Local Datastore

Parse.enableLocalDatastore();

ParseQuery<ParseObject> query = ParseQuery.getQuery(“GameScore");query.orderByDescending(“score”);query.fromLocalDatastore();query.findInBackground(new FindCallback<ParseObject>() { ...});

Parse Local Datastore

Parse Config

Create and manage configuration variables for your apps from the Parse Dashboard

PARSE PUSH

1 device + 1 install of your app = 1 Installation

Pushes are sent to Installations

ParseInstallation.getCurrentInstallation().saveInBackground();

INSTALLATIONS

Add relationships to objects of interest, e.g. users

Channels vs Queries

Target stable interest groups with channels

PUSH TARGETING

Send pushes to ad-hoc or changing groups by pushing to queries

To push to a query, your Installation class must point

to the class of interest

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

PUSH TO A CHANNEL

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

PUSH TO A CHANNELParsePush push = new ParsePush();push.setChannel(”PSGFans”);push.setMessage(”The game starts now on channel 5!”);push.sendInBackground();

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

PUSH TO A QUERY

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

PUSH TO A QUERYParseQuery pushQuery = ParseInstallation.getQuery();pushQuery.whereEqualTo(”hasCheckedInToVenue”, true);

ParsePush push = new ParsePush();push.setQuery(pushQuery);push.setMessage(”The keynote is about to start!”);push.sendInBackground();

DEMO TIME!

PARSE ANALYTICS

Measure App Usage

API calls

PARSE ANALYTICS

Burst rates Responses to push notifications

Events + Dimensions

Create your own events and track custom user

behaviour

CUSTOM EVENTS

Slice and dice your data however you choose

Save additional parameters with

dimensions

CUSTOM EVENTS

event: "signedUp"dimensions: {gender: "f",source: "web",friendsUsingApp: "35",wasReferred: "true"

}

CUSTOM EVENTS

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

CUSTOM EVENTS

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor vitae, commodo a nisi. Morbi tincidunt felis lacus, nec congue tortor consectetur id. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.

CUSTOM EVENTSMap<String, String> dimensions = new HashMap<String, String>();

// Add key-value pairs to be saved alongside eventdimensions.put(”gender”,”f”);dimensions.put(”source”,”web”);// Consider using buckets to meaningfully segment eventsdimensions.put(”friendsUsingApp”,”25-50”);dimensions.put(”wasReferred”,”true”);

ParseAnalytics.trackEvent(”signup”, dimensions);

Knowledge is Power

Is the first level of my game too hard?

CUSTOM EVENTS

Why aren’t people completing purchases

in my app?

How successful was our last push campaign?

Understanding Growth

Understanding Retention

Understanding Retention

Understanding Retention

0

50,000

100,000

150,000

300,000

2011 2012 2013 2014

200,000

250,000

2015

Apps

bui

lt on

Par

se

0

50,000

100,000

150,000

300,000

2011 2012 2013 2014

200,000

250,000

2015

Apps

bui

lt on

Par

se

Over260,000 Apps Built!

0

50,000

100,000

150,000

300,000

2011 2012 2013 2014

200,000

250,000

2015

Apps

bui

lt on

Par

se

180,000new developers this year

New Parse Customers

Pricing

Parse Core Parse Push Parse Analytics

FREE & UNLIMITED

up to 30 requests/sec

($100pcm extra per 10 r/sec extra)

FREE & UNLIMITED

up to 1,000,000 recipients ($0.05 per 1,000 recipients extra)

FREE & UNLIMITED

data points

THANKS, QUESTIONS?

top related