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(”[email protected]”);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?