BUILDING YOUR MOBILE BACKEND WITH PARSE 
ALI PARR 
PLATFORM PARTNERSHIPS
IDENTITY 
SHARING 
PUSH NOTIFICATIONS 
APP INSTALLS 
MONETIZATION
PUSMAHPO NISPNDHO EIEATNTNIRISFZTIITAINCTATGAYLIOTLSINONS
2 YEAR 
CORE API STABILITY GUARANTEE
VERSIONING 
FOR ALL APIs
48 HOUR 
MAJOR BUG FIX SLA
BUILD GROW 
App Installs 
Sharing 
Messaging 
MONETIZE 
Payments 
Audience Network 
Parse 
Login 
App Events 
App Links
UI BINDINGS 
FILES 
PUSH NOTIFICATIONS 
SOCIAL 
USER SESSIONS 
DATA MODELS 
CACHING 
NETWORKING 
APP BUSINESS LOGIC 
APP SECURITY 
MIDDLEWARE 
ROUTING 
RESTful API 
DATABASE BINDINGS 
LOAD BALANCING 
PHYSICAL SERVERS
YOUR APP 
UI BINDINGS 
FILES 
PUSH NOTIFICATIONS 
SOCIAL 
USER SESSIONS 
DATA MODELS 
CACHING 
NETWORKING 
APP BUSINESS LOGIC 
APP SECURITY 
MIDDLEWARE 
ROUTING 
RESTful API 
DATABASE BINDINGS 
LOAD BALANCING 
PHYSICAL SERVERS
YOUR APP 
PARSE
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 
Title 
Everything You Need to Know About 
Login 
Time 12:30 
Speaker Eddie O’Neil 
isFavorite FALSE
SAVING TO PARSE 
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 
ParseObject talk = new ParseObject(”Talk”); 
talk.put(“title”, “Opening Keynote”); 
talk.put(“speaker”, “Mark Zuckerberg”); 
talk.put(“time”, talkDate); // Date 
talk.put(“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 PARSE 
ParseObject talk = new ParseObject(”Talk”); 
talk.put(“title”, “Opening Keynote”); 
talk.put(“speaker”, “Mark Zuckerberg”); 
talk.put(“time”, talkDate); // Date 
talk.put(“isFavorite”, false); 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, 
posuere talk.saveInBackground(); 
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.
DEMO TIME!
PARSE QUERY 
ParseQuery<ParseObject> query = 
ParseQuery.getQuery(”Talk”); 
// Find only the talks that are in the Build track 
query.whereEqualTo(”track”,”Build”); 
query.findInBackground(new FindCallback<ParseObject>(){ 
p ublic 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 
} 
}
PARSE QUERY 
ParseQuery<ParseObject> query = 
ParseQuery.getQuery(”Talk”); 
} 
// Find only the talks that are in the Build track 
query.whereEqualTo(”track”,”Build”); 
query.findInBackground(new FindCallback<ParseObject>(){ 
p ublic 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 
} 
}
PARSE SOCIAL 
Easy User & Session Management 
Sign up 
Improve app 
security with ACLs 
Log in & add 3rd Create Roles 
party auth 
Manage user session 
with “currentUser”
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 PERSON 
ParseUser 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 IN 
ParseUser.logInInBackground( ”janedoe”, 
”mypass123”, new LogInCallback() { 
public void done(ParseUser user, ParseException e) { 
if (user != null) { 
// The user is logged in 
} else { 
Lorem ipsum // dolor Something sit amet, went consectetur wrong; check the adipiscing ParseException 
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 
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 
ParseObject post = new ParseObject(”Post”); 
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 
Lorem ipsum dolor sit amet, orientation consectetur only?”); 
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 
ParseObject post = new ParseObject(”Post”); 
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 
Lorem ipsum dolor sit amet, orientation consectetur only?”); 
adipiscing elit. Nam urna nisi, 
posuere post.saveInBackground(); 
in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt 
ac tempor // This post vitae, is commodo now saved with a nisi. an Morbi ACL; the tincidunt default felis is 
lacus, nec 
congue // public tortor read, consectetur writes only id. by Lorem the user ipsum that dolor saved it 
sit amet, 
consectetur adipiscing elit. Sed semper dapibus eleifend.
SAVE A FILE 
byte[] data = myPhotoObject.toByteArray();
SAVE A FILE 
byte[] data = myPhotoObject.toByteArray(); 
ParseFile speakerPhoto = new ParseFile(”hector_bw.jpg”, data); 
speakerPhoto.saveInBackground();
SAVE A FILE 
byte[] data = myPhotoObject.toByteArray(); 
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();
SAVE A FILE 
byte[] data = myPhotoObject.toByteArray(); 
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();
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
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 JOB 
Parse.Cloud.job(”lowercaseallthethings”, function (request, status) { 
// Set up to modify user data 
Parse.Cloud.useMasterKey(); 
// Query for all users 
var query = new Parse.Query(Parse.User); 
query.each(function(user) { 
// Set and save the change 
user.set(”name”, user.name.toLowerCase()); 
return user.save(); 
}).then(function() { 
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, Set the commodo job’s success a nisi. and Morbi error tincidunt statuses 
felis lacus, nec 
status.success(”All users now have lowercase names”); 
congue }, tortor function(consectetur error) { 
id. Lorem ipsum dolor sit amet, 
consectetur status.error(”Job did not complete.”); 
}); 
adipiscing elit. Sed semper dapibus eleifend. 
}
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
INSTALLATIONS 
1 device + 1 install of your app = 1 Installation 
Pushes are sent to 
Installations 
Add relationships to objects 
of interest, e.g. users 
ParseInstallation.getCurrentInstallation().saveInBackground();
PUSH TARGETING 
Channels vs Queries 
Target stable interest 
groups with channels 
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
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 CHANNEL 
ParsePush 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 QUERY 
ParseQuery pushQuery = ParseInstallation.getQuery(); 
pushQuery.whereEqualTo(”hasCheckedInToVenue”, true); 
ParsePush push = new ParsePush(); 
push.setQuery(pushQuery); 
push.setMessage(”The keynote is about to start!”); 
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.
DEMO TIME!
PARSE ANALYTICS
PARSE ANALYTICS 
Measure App Usage 
API calls 
Burst rates Responses to push 
notifications
CUSTOM EVENTS 
Events + Dimensions 
Create your own events 
and track custom user 
behaviour 
Slice and dice your data 
however you choose 
Save additional 
parameters with 
dimensions
CUSTOM EVENTS
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 
Map<String, String> dimensions = new HashMap<String, String>(); 
// Add key-value pairs to be saved alongside event 
dimensions.put(”gender”,”f”); 
dimensions.put(”source”,”web”); 
// Consider using buckets to meaningfully segment events 
dimensions.put(”friendsUsingApp”,”25-50”); 
dimensions.put(”wasReferred”,”true”); 
ParseAnalytics.trackEvent(”signup”, dimensions); 
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 
Knowledge is Power 
Is the first level of my 
game too hard? 
Why aren’t people 
completing purchases 
in my app? 
How successful was our 
last push campaign?
Understanding Growth
Understanding Retention
Understanding Retention
Understanding Retention
300,000 
250,000 
200,000 
150,000 
100,000 
50,000 
0 
2011 2012 2013 2014 
2015 
Apps built on Parse
300,000 
250,000 
200,000 
150,000 
100,000 
50,000 
0 
2011 2012 2013 2014 
2015 
Apps built on Parse
Over260,000Apps Built! 
300,000 
250,000 
200,000 
150,000 
100,000 
50,000 
0 
2011 2012 2013 2014 
2015 
Apps built on Parse
180,000 new 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?

Workshop: building your mobile backend with Parse - Droidcon Paris2014

  • 1.
    BUILDING YOUR MOBILEBACKEND WITH PARSE ALI PARR PLATFORM PARTNERSHIPS
  • 4.
    IDENTITY SHARING PUSHNOTIFICATIONS APP INSTALLS MONETIZATION
  • 5.
  • 6.
    2 YEAR COREAPI STABILITY GUARANTEE
  • 7.
  • 8.
    48 HOUR MAJORBUG FIX SLA
  • 12.
    BUILD GROW AppInstalls Sharing Messaging MONETIZE Payments Audience Network Parse Login App Events App Links
  • 16.
    UI BINDINGS FILES PUSH NOTIFICATIONS SOCIAL USER SESSIONS DATA MODELS CACHING NETWORKING APP BUSINESS LOGIC APP SECURITY MIDDLEWARE ROUTING RESTful API DATABASE BINDINGS LOAD BALANCING PHYSICAL SERVERS
  • 17.
    YOUR APP UIBINDINGS FILES PUSH NOTIFICATIONS SOCIAL USER SESSIONS DATA MODELS CACHING NETWORKING APP BUSINESS LOGIC APP SECURITY MIDDLEWARE ROUTING RESTful API DATABASE BINDINGS LOAD BALANCING PHYSICAL SERVERS
  • 18.
  • 20.
    Parse Core ParsePush Parse Analytics
  • 22.
  • 23.
    PARSE CORE Yourbackend 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
  • 24.
  • 25.
    THE F8 APP Key Value Title Everything You Need to Know About Login Time 12:30 Speaker Eddie O’Neil isFavorite FALSE
  • 26.
    SAVING TO PARSE 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.
  • 27.
    SAVING TO PARSE ParseObject talk = new ParseObject(”Talk”); talk.put(“title”, “Opening Keynote”); talk.put(“speaker”, “Mark Zuckerberg”); talk.put(“time”, talkDate); // Date talk.put(“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.
  • 28.
    SAVING TO PARSE ParseObject talk = new ParseObject(”Talk”); talk.put(“title”, “Opening Keynote”); talk.put(“speaker”, “Mark Zuckerberg”); talk.put(“time”, talkDate); // Date talk.put(“isFavorite”, false); Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam urna nisi, posuere talk.saveInBackground(); 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.
  • 30.
  • 31.
    PARSE QUERY ParseQuery<ParseObject>query = ParseQuery.getQuery(”Talk”); // Find only the talks that are in the Build track query.whereEqualTo(”track”,”Build”); query.findInBackground(new FindCallback<ParseObject>(){ p ublic 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 } }
  • 32.
    PARSE QUERY ParseQuery<ParseObject>query = ParseQuery.getQuery(”Talk”); } // Find only the talks that are in the Build track query.whereEqualTo(”track”,”Build”); query.findInBackground(new FindCallback<ParseObject>(){ p ublic 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 } }
  • 33.
    PARSE SOCIAL EasyUser & Session Management Sign up Improve app security with ACLs Log in & add 3rd Create Roles party auth Manage user session with “currentUser”
  • 34.
    SIGN UP APERSON 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.
  • 35.
    SIGN UP APERSON ParseUser 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.
  • 36.
    LOG A PERSONIN 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.
  • 37.
    LOG A PERSONIN ParseUser.logInInBackground( ”janedoe”, ”mypass123”, new LogInCallback() { public void done(ParseUser user, ParseException e) { if (user != null) { // The user is logged in } else { Lorem ipsum // dolor Something sit amet, went consectetur wrong; check the adipiscing ParseException 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.
  • 38.
    SAVING TO PARSEWITH A CURRENT USER 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.
  • 39.
    SAVING TO PARSEWITH A CURRENT USER ParseObject post = new ParseObject(”Post”); 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 Lorem ipsum dolor sit amet, orientation consectetur only?”); 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.
  • 40.
    SAVING TO PARSEWITH A CURRENT USER ParseObject post = new ParseObject(”Post”); 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 Lorem ipsum dolor sit amet, orientation consectetur only?”); adipiscing elit. Nam urna nisi, posuere post.saveInBackground(); in magna eget, aliquet luctus eros. Nam metus nisi, tincidunt ac tempor // This post vitae, is commodo now saved with a nisi. an Morbi ACL; the tincidunt default felis is lacus, nec congue // public tortor read, consectetur writes only id. by Lorem the user ipsum that dolor saved it sit amet, consectetur adipiscing elit. Sed semper dapibus eleifend.
  • 41.
    SAVE A FILE byte[] data = myPhotoObject.toByteArray();
  • 42.
    SAVE A FILE byte[] data = myPhotoObject.toByteArray(); ParseFile speakerPhoto = new ParseFile(”hector_bw.jpg”, data); speakerPhoto.saveInBackground();
  • 43.
    SAVE A FILE byte[] data = myPhotoObject.toByteArray(); 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();
  • 44.
    SAVE A FILE byte[] data = myPhotoObject.toByteArray(); 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();
  • 45.
    CLOUD CODE Runcustom 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
  • 46.
    CLOUD MODULES Easythird-party integration with pre-built modules Send email Take payments Add SMS to your app Connect with any RESTful service using Parse.Cloud.httpRequest
  • 47.
    BACKGROUND JOBS Schedulelong-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
  • 48.
    BACKGROUND JOBS Schedulelong-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
  • 49.
    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.
  • 50.
    A SIMPLE JOB Parse.Cloud.job(”lowercaseallthethings”, function (request, status) { // Set up to modify user data Parse.Cloud.useMasterKey(); // Query for all users var query = new Parse.Query(Parse.User); query.each(function(user) { // Set and save the change user.set(”name”, user.name.toLowerCase()); return user.save(); }).then(function() { 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, Set the commodo job’s success a nisi. and Morbi error tincidunt statuses felis lacus, nec status.success(”All users now have lowercase names”); congue }, tortor function(consectetur error) { id. Lorem ipsum dolor sit amet, consectetur status.error(”Job did not complete.”); }); adipiscing elit. Sed semper dapibus eleifend. }
  • 55.
  • 56.
  • 57.
    Parse.enableLocalDatastore(); ParseQuery<ParseObject> query= ParseQuery.getQuery(“GameScore"); query.orderByDescending(“score”); query.fromLocalDatastore(); query.findInBackground(new FindCallback<ParseObject>() { ... }); Parse Local Datastore
  • 58.
    Parse Config Createand manage configuration variables for your apps from the Parse Dashboard
  • 59.
  • 60.
    INSTALLATIONS 1 device+ 1 install of your app = 1 Installation Pushes are sent to Installations Add relationships to objects of interest, e.g. users ParseInstallation.getCurrentInstallation().saveInBackground();
  • 61.
    PUSH TARGETING Channelsvs Queries Target stable interest groups with channels 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
  • 62.
    PUSH TO ACHANNEL 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.
  • 63.
    PUSH TO ACHANNEL ParsePush 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.
  • 64.
    PUSH TO AQUERY 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.
  • 65.
    PUSH TO AQUERY ParseQuery pushQuery = ParseInstallation.getQuery(); pushQuery.whereEqualTo(”hasCheckedInToVenue”, true); ParsePush push = new ParsePush(); push.setQuery(pushQuery); push.setMessage(”The keynote is about to start!”); 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.
  • 68.
  • 69.
  • 70.
    PARSE ANALYTICS MeasureApp Usage API calls Burst rates Responses to push notifications
  • 72.
    CUSTOM EVENTS Events+ Dimensions Create your own events and track custom user behaviour Slice and dice your data however you choose Save additional parameters with dimensions
  • 73.
  • 74.
    CUSTOM EVENTS event:"signedUp" dimensions: { gender: "f", source: "web", friendsUsingApp: "35", wasReferred: "true" }
  • 75.
    CUSTOM EVENTS Loremipsum 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.
  • 76.
    CUSTOM EVENTS Map<String,String> dimensions = new HashMap<String, String>(); // Add key-value pairs to be saved alongside event dimensions.put(”gender”,”f”); dimensions.put(”source”,”web”); // Consider using buckets to meaningfully segment events dimensions.put(”friendsUsingApp”,”25-50”); dimensions.put(”wasReferred”,”true”); ParseAnalytics.trackEvent(”signup”, dimensions); 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.
  • 78.
    CUSTOM EVENTS Knowledgeis Power Is the first level of my game too hard? Why aren’t people completing purchases in my app? How successful was our last push campaign?
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
    300,000 250,000 200,000 150,000 100,000 50,000 0 2011 2012 2013 2014 2015 Apps built on Parse
  • 85.
    300,000 250,000 200,000 150,000 100,000 50,000 0 2011 2012 2013 2014 2015 Apps built on Parse
  • 86.
    Over260,000Apps Built! 300,000 250,000 200,000 150,000 100,000 50,000 0 2011 2012 2013 2014 2015 Apps built on Parse
  • 87.
  • 88.
  • 89.
  • 90.
    Parse Core ParsePush 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
  • 91.