SlideShare a Scribd company logo
BUILDING YOUR MOBILE BACKEND WITH PARSE 
ALI PARR 
PLATFORM PARTNERSHIPS
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
BUILD GROW 
App Installs 
Sharing 
Messaging 
MONETIZE 
Payments 
Audience Network 
Parse 
Login 
App Events 
App Links
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Parse Core Parse Push Parse Analytics
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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.
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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. 
}
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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.
Workshop: building your mobile backend with Parse - Droidcon Paris2014
Workshop: building your mobile backend with Parse - Droidcon Paris2014
DEMO TIME!
PARSE ANALYTICS
PARSE ANALYTICS 
Measure App Usage 
API calls 
Burst rates Responses to push 
notifications
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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.
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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?
Workshop: building your mobile backend with Parse - Droidcon Paris2014
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?

More Related Content

Viewers also liked (10)

PDF
State of application development - 2017 research report
OutSystems
 
PPTX
It's Time For Real-Time | TemboStatus
TemboStatus
 
PDF
50 Ways To Understand The Digital Customer Experience
Cognizant
 
PDF
Digital Disruption: Embracing the Future of Work
accenture
 
PPTX
Cisco final ppt
Amin Hajoli
 
PDF
Internet of Things (IoT) - We Are at the Tip of An Iceberg
Dr. Mazlan Abbas
 
PDF
Digital Trends in 2017: Making Business Impact in a Changing World
Edelman
 
PPT
Internet of Things and its applications
Pasquale Puzio
 
PPTX
IoT - IT 423 ppt
Mhae Lyn
 
PDF
Build Features, Not Apps
Natasha Murashev
 
State of application development - 2017 research report
OutSystems
 
It's Time For Real-Time | TemboStatus
TemboStatus
 
50 Ways To Understand The Digital Customer Experience
Cognizant
 
Digital Disruption: Embracing the Future of Work
accenture
 
Cisco final ppt
Amin Hajoli
 
Internet of Things (IoT) - We Are at the Tip of An Iceberg
Dr. Mazlan Abbas
 
Digital Trends in 2017: Making Business Impact in a Changing World
Edelman
 
Internet of Things and its applications
Pasquale Puzio
 
IoT - IT 423 ppt
Mhae Lyn
 
Build Features, Not Apps
Natasha Murashev
 

Similar to Workshop: building your mobile backend with Parse - Droidcon Paris2014 (20)

ODP
Apache Aries Blog Sample
Skills Matter
 
ODP
Software Project Management
Widoyo PH
 
ODP
Intro To Spring Python
gturnquist
 
PDF
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
Red Hat Developers
 
ODP
Easy Web Project Development & Management with Django & Mercurial
Widoyo PH
 
PDF
Ten Battle-Tested Tips for Atlassian Connect Add-ons
Atlassian
 
PPTX
SCULPT! YOUR! TESTS!
Taras Oleksyn
 
PDF
#SPUG - Legacy applications
Piotr Pasich
 
PDF
IPaste SDK v.1.0
xrebyc
 
PDF
Modular Test-driven SPAs with Spring and AngularJS
Gunnar Hillert
 
PDF
InterConnect2016: WebApp Architectures with Java and Node.js
Chris Bailey
 
PDF
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
tdc-globalcode
 
PDF
Bringing order to the chaos! - Paulo Lopes - Codemotion Amsterdam 2018
Codemotion
 
PPT
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
Mats Bryntse
 
PPTX
Java ee 7 New Features
Shahzad Badar
 
PDF
Secure Coding For Java - Une introduction
Sebastien Gioria
 
PDF
Construindo APIs de forma produtiva com Spring Boot, Spring Data e Spring MVC
Emmanuel Neri
 
PDF
Mozilla Web Apps - Super-VanJS
Robert Nyman
 
PPTX
REST API for your WP7 App
Agnius Paradnikas
 
PDF
Questioning the status quo
Ivano Pagano
 
Apache Aries Blog Sample
Skills Matter
 
Software Project Management
Widoyo PH
 
Intro To Spring Python
gturnquist
 
Boost Development With Java EE7 On EAP7 (Demitris Andreadis)
Red Hat Developers
 
Easy Web Project Development & Management with Django & Mercurial
Widoyo PH
 
Ten Battle-Tested Tips for Atlassian Connect Add-ons
Atlassian
 
SCULPT! YOUR! TESTS!
Taras Oleksyn
 
#SPUG - Legacy applications
Piotr Pasich
 
IPaste SDK v.1.0
xrebyc
 
Modular Test-driven SPAs with Spring and AngularJS
Gunnar Hillert
 
InterConnect2016: WebApp Architectures with Java and Node.js
Chris Bailey
 
TDC2017 | São Paulo - Trilha Java EE How we figured out we had a SRE team at ...
tdc-globalcode
 
Bringing order to the chaos! - Paulo Lopes - Codemotion Amsterdam 2018
Codemotion
 
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
Mats Bryntse
 
Java ee 7 New Features
Shahzad Badar
 
Secure Coding For Java - Une introduction
Sebastien Gioria
 
Construindo APIs de forma produtiva com Spring Boot, Spring Data e Spring MVC
Emmanuel Neri
 
Mozilla Web Apps - Super-VanJS
Robert Nyman
 
REST API for your WP7 App
Agnius Paradnikas
 
Questioning the status quo
Ivano Pagano
 
Ad

More from Paris Android User Group (20)

PDF
Workshop: Amazon developer ecosystem - DroidCon Paris2014
Paris Android User Group
 
PDF
Extending your apps to wearables - DroidCon Paris 2014
Paris Android User Group
 
PDF
Scaling android development - DroidCon Paris 2014
Paris Android User Group
 
PDF
Ingredient of awesome app - DroidCon Paris 2014
Paris Android User Group
 
PDF
Framing the canvas - DroidCon Paris 2014
Paris Android User Group
 
PDF
Deep dive into android restoration - DroidCon Paris 2014
Paris Android User Group
 
PDF
Archos Android based connected home solution - DroidCon Paris 2014
Paris Android User Group
 
PDF
Porting VLC on Android - DroidCon Paris 2014
Paris Android User Group
 
PDF
Robotium vs Espresso: Get ready to rumble ! - DroidCon Paris 2014
Paris Android User Group
 
PDF
Buildsystem.mk - DroidCon Paris 2014
Paris Android User Group
 
PDF
maximize app engagement and monetization - DroidCon Paris 2014
Paris Android User Group
 
PPTX
Using the android ndk - DroidCon Paris 2014
Paris Android User Group
 
PPTX
Holo material design transition - DroidCon Paris 2014
Paris Android User Group
 
PPTX
Death to passwords - DroidCon Paris 2014
Paris Android User Group
 
PPTX
Google glass droidcon - DroidCon Paris 2014
Paris Android User Group
 
PPTX
Embedded webserver implementation and usage - DroidCon Paris 2014
Paris Android User Group
 
PDF
Petit design Grande humanité par Geoffrey Dorne - DroidCon Paris 2014
Paris Android User Group
 
PDF
What's new in android 4.4 - Romain Guy & Chet Haase
Paris Android User Group
 
PDF
Efficient Image Processing - Nicolas Roard
Paris Android User Group
 
PDF
Build a user experience by Eyal Lezmy
Paris Android User Group
 
Workshop: Amazon developer ecosystem - DroidCon Paris2014
Paris Android User Group
 
Extending your apps to wearables - DroidCon Paris 2014
Paris Android User Group
 
Scaling android development - DroidCon Paris 2014
Paris Android User Group
 
Ingredient of awesome app - DroidCon Paris 2014
Paris Android User Group
 
Framing the canvas - DroidCon Paris 2014
Paris Android User Group
 
Deep dive into android restoration - DroidCon Paris 2014
Paris Android User Group
 
Archos Android based connected home solution - DroidCon Paris 2014
Paris Android User Group
 
Porting VLC on Android - DroidCon Paris 2014
Paris Android User Group
 
Robotium vs Espresso: Get ready to rumble ! - DroidCon Paris 2014
Paris Android User Group
 
Buildsystem.mk - DroidCon Paris 2014
Paris Android User Group
 
maximize app engagement and monetization - DroidCon Paris 2014
Paris Android User Group
 
Using the android ndk - DroidCon Paris 2014
Paris Android User Group
 
Holo material design transition - DroidCon Paris 2014
Paris Android User Group
 
Death to passwords - DroidCon Paris 2014
Paris Android User Group
 
Google glass droidcon - DroidCon Paris 2014
Paris Android User Group
 
Embedded webserver implementation and usage - DroidCon Paris 2014
Paris Android User Group
 
Petit design Grande humanité par Geoffrey Dorne - DroidCon Paris 2014
Paris Android User Group
 
What's new in android 4.4 - Romain Guy & Chet Haase
Paris Android User Group
 
Efficient Image Processing - Nicolas Roard
Paris Android User Group
 
Build a user experience by Eyal Lezmy
Paris Android User Group
 
Ad

Recently uploaded (20)

PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
PDF
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
PDF
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
PDF
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
PDF
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
PPTX
Simple and concise overview about Quantum computing..pptx
mughal641
 
PDF
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
PPTX
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
Market Insight : ETH Dominance Returns
CIFDAQ
 
PDF
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
PPTX
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
PDF
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
PDF
The Future of Artificial Intelligence (AI)
Mukul
 
PPTX
Introduction to Flutter by Ayush Desai.pptx
ayushdesai204
 
PPTX
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
PPTX
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
Generative AI vs Predictive AI-The Ultimate Comparison Guide
Lily Clark
 
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
Data_Analytics_vs_Data_Science_vs_BI_by_CA_Suvidha_Chaplot.pdf
CA Suvidha Chaplot
 
Simple and concise overview about Quantum computing..pptx
mughal641
 
TrustArc Webinar - Navigating Data Privacy in LATAM: Laws, Trends, and Compli...
TrustArc
 
What-is-the-World-Wide-Web -- Introduction
tonifi9488
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
Market Insight : ETH Dominance Returns
CIFDAQ
 
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
OA presentation.pptx OA presentation.pptx
pateldhruv002338
 
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
The Future of Artificial Intelligence (AI)
Mukul
 
Introduction to Flutter by Ayush Desai.pptx
ayushdesai204
 
Applied-Statistics-Mastering-Data-Driven-Decisions.pptx
parmaryashparmaryash
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
IT Runs Better with ThousandEyes AI-driven Assurance
ThousandEyes
 

Workshop: building your mobile backend with Parse - Droidcon Paris2014

  • 1. BUILDING YOUR MOBILE BACKEND WITH PARSE ALI PARR PLATFORM PARTNERSHIPS
  • 4. IDENTITY SHARING PUSH NOTIFICATIONS APP INSTALLS MONETIZATION
  • 6. 2 YEAR CORE API STABILITY GUARANTEE
  • 8. 48 HOUR MAJOR BUG FIX SLA
  • 12. BUILD GROW App Installs 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 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
  • 20. Parse Core Parse Push Parse Analytics
  • 23. 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
  • 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.
  • 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 Easy User & 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 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.
  • 35. SIGN UP A PERSON ParseUser 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.
  • 36. 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.
  • 37. 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.
  • 38. 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.
  • 39. 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.
  • 40. 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.
  • 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 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
  • 46. 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
  • 47. 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
  • 48. 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
  • 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. }
  • 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 Create and manage configuration variables for your apps from the Parse Dashboard
  • 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 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
  • 62. 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.
  • 63. 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.
  • 64. 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.
  • 65. 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.
  • 70. PARSE ANALYTICS Measure App 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
  • 74. CUSTOM EVENTS event: "signedUp" dimensions: { gender: "f", source: "web", friendsUsingApp: "35", wasReferred: "true" }
  • 75. 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.
  • 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 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?
  • 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
  • 90. 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