Slide 1

Slide 1 text

Parse   Andrew  Wang  

Slide 2

Slide 2 text

About  me   •  Backend  developer  at  Parse,  by  day   •  Mobile  app  maker,  by  night  

Slide 3

Slide 3 text

Apps  I  made   •  GonePixel.com   – Art  Gala     – FluffyCreatures   •  MagicAnywhere.com      

Slide 4

Slide 4 text

I  need  a  cloud   •  Key-­‐value  or  Relational  store   •  File  store   •  User  management   •  Push  notification   •  In-­‐app  purchases  

Slide 5

Slide 5 text

Building  the  cloud   •  Set  up  a  server     –  AWS,  Heroku   •  Set  up  database   –  MySQL,  Postgres,  Mongo   •  Set  up  REST  endpoints   –  Ruby,  PHP,  Python,  Rails,  Django,  Node.js   •  Write  boilerplate  logic   –  User  accounts,  authorization,  authentication  

Slide 6

Slide 6 text

That’s  not  all!   •  Mobile  plumbing   – JSON  parsing   – Data  access  API  design   – Client  logic  for  retrying,  caching,  users    

Slide 7

Slide 7 text

DIY  Cloud   •  A  lot  of  technologies   •  A  lot  of  boilerplate  code   •  A  lot  of  unimaginative  work  

Slide 8

Slide 8 text

All  I  want   •  Save  an  object:   ! [gameScore setObject:@"Andrew" forKey:@”player"];! [gameScore setObject:@100 forKey:@”score"];! [gameScore save];!

Slide 9

Slide 9 text

All  I  want   •  Sign  up  a  user:     PFUser *user = [PFUser user];! user.username = @"Andrew";! user.password = @”love";! [user signUp];  

Slide 10

Slide 10 text

Welcome  to  Parse!   •  Simple   •  Instant  Backend   •  Scalable   •  Reliable  

Slide 11

Slide 11 text

Registration   •  Register  with  Parse  to  get  a  key  and  app  id   •  In  AppDelegate.m,  you  write:   ! #import   [Parse setApplicationId:@”…” clientKey:@”…"];  

Slide 12

Slide 12 text

Storing  Objects   PFObject *score = [PFObject objectWithClassName:@”Score"]; ! [score setObject:@"Andrew" forKey:@”player"];! [score setObject:@100 forKey:@”points"];! [score save];! ! !    

Slide 13

Slide 13 text

PFObject   •  A  PFObject  is  like  a  dictionary   – No  schema  required   – You  provide  a  class  name  for  grouping   – String,  number,  boolean,  array,  dictionary,  binary   data,  geopoint,  date.      

Slide 14

Slide 14 text

Retrieving  Objects   PFQuery *query = [PFQuery queryWithClassName:@"Score"];! NSArray *scores = [query findObjects];! for (PFObject *score in scores) {! NSLog(@”%@", [score objectForKey:@"points"]);! NSLog(@"%@", [score objectForKey:@”player"]);! }  

Slide 15

Slide 15 text

Complex  PFQuery   PFQuery *query = [PFQuery queryWithClassName:@"Score"];! [query whereKey:@"player" hasPrefix:@"A"];! [query whereKey:@"score" equalTo:@100];! NSArray *scores = [query findObjects];  

Slide 16

Slide 16 text

Saving  Files   •  Image  -­‐>  NSData  -­‐>  PFFile  -­‐>  PFObject   ! UIImage *image = [UIImage imageNamed:@"andrew.jpg"];! NSData *imageData = UIImagePNGRepresentation(image);! PFFile *imageFile = [PFFile fileWithData:imageData];! [imageFile save];! ! PFObject *guest = [PFObject objectWithClassName:@"Guest"];! [guest setObject:@"Andrew" forKey:@"name"];! [guest setObject:imageFile forKey:@"imageFile"];! [guest save];    

Slide 17

Slide 17 text

Users   •  Sign  up   •  Log  in   •  Log  out   •  Anonymous  users   •  Email  verification   •  Forgotten  password   •  Facebook,  Twitter  login  

Slide 18

Slide 18 text

User  Sign-­‐Up   PFUser *user = [PFUser user];! user.username = @"Andrew";! user.password = @"peace";! user.email = @"andrew@parse.com";! ! // other fields can be set like with PFObject! [user setObject:@"425-922-1234" forKey:@"phone"];! [user signUpInBackgroundWithBlock:^(BOOL success, NSError *error) {! if (!error) {! // Success! Let the user uses the app now.! } else {! // probably username is taken! NSLog(@"%@", error);! }! }];  

Slide 19

Slide 19 text

User  Log-­‐In   [PFUser logInWithUsernameInBackground:@"Andrew" password:@"peace"! block:^(PFUser *user, NSError *error) {! if (!error) {! // Success!! NSLog(@"%@", user);! } else {! // Failed.! // Probably incorrect username/password combination.! }! }];  

Slide 20

Slide 20 text

Forgotten  Passwords   [PFUser requestPasswordResetForEmail:@”andrew@parse.com"];! •  User  requests  that  his  password  be  reset   •  Parse  sends  an  email  containing  a  special  reset  link   •  User  clicks  on  the  reset  link,  and  is  directed  to  a  special  Parse  page   •  User  types  in  a  new  password  

Slide 21

Slide 21 text

PFLogInViewController  

Slide 22

Slide 22 text

PFLogInViewController   PFLogInViewController *controller = [[PFLogInViewController alloc] init];! controller.delegate = self;! [self presentViewController:controller animated:YES completion:nil];  

Slide 23

Slide 23 text

Push  Notifications   •  Send  a  push:   [PFPush sendPushMessageToChannelInBackground:@""! withMessage:@"Usain Bolt wins!"];   •  Receive  a  push:   [PFPush subscribeToChannelInBackground:@""];  

Slide 24

Slide 24 text

Thanks!   •  iOS,  Android,  JS,  REST   •  Parse.com   •  @andruwang   •  andrew@parse.com