Scalable Cloud Apps That Won't Keep You Up At Night
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Scalable Cloud Apps That Won't Keep You Up At Night

  • 2,059 views
Uploaded on

Most applications writing for mobile platforms need some sort of integration with web services. Unfortunately, most times backend infrastructure becomes an oversight and the app ends up suffering......

Most applications writing for mobile platforms need some sort of integration with web services. Unfortunately, most times backend infrastructure becomes an oversight and the app ends up suffering in the long run. Using cloud infrastructure technologies like Parse can help you get from concept to App Store insertion in no time. Parse's simple API, extendable Cloud Code feature and Push notification API let you focus on your app while getting a scalable backend solution.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
2,059
On Slideshare
1,892
From Embeds
167
Number of Embeds
3

Actions

Shares
Downloads
17
Comments
2
Likes
2

Embeds 167

https://twitter.com 159
http://eventifier.co 7
http://eventifier.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Scalable Cloud Apps That Wont Keep You Up At Night Aaron Douglas @astralbodies Twitter/ADN Red Arrow Labs - Milwaukee, WIFriday, March 8, 13
  • 2. So you have an app (or an idea)Friday, March 8, 13
  • 3. You want people to download and use it.Friday, March 8, 13
  • 4. Most apps need to integrate with something.Friday, March 8, 13
  • 5. Because integration (collaboration) is interestingFriday, March 8, 13
  • 6. Interesting apps = MOAR MONEYFriday, March 8, 13
  • 7. Why should I use the “Cloud”?Friday, March 8, 13
  • 8. Scalability & InfrastructureFriday, March 8, 13
  • 9. Cross PlatformFriday, March 8, 13
  • 10. Our App IdeaFriday, March 8, 13
  • 11. • Conference App • Speakers • Sessions • Map • Comments & Notes • PhotosFriday, March 8, 13
  • 12. Why not iCloud? • Still a hot mess with Core Data • iOS and Mac only • Hard to debugFriday, March 8, 13
  • 13. OptionsFriday, March 8, 13
  • 14. We’re Going to Use ParseFriday, March 8, 13
  • 15. What Parse Provides • Data storage - RESTful API & Native SDKs • Queries • ACLs / Users • Cloud Code & Push Notifications • File Storage • In-App Purchases • GeoPoints & Spatial QueriesFriday, March 8, 13
  • 16. Friday, March 8, 13
  • 17. Add To Your Project $ vi Podfile pod Parse $ pod installFriday, March 8, 13
  • 18. Friday, March 8, 13
  • 19. Friday, March 8, 13
  • 20. AppDelegate.m #import <Parse/Parse.h> ... [Parse setApplicationId:@"3lZSGBNTs03wQigx2apDHwUv6ZczMVaIib8nUz" clientKey:@"rstZrElVxBiB5tzsWn10QK9AfrRR0GkQQj16Hj"];Friday, March 8, 13
  • 21. Objects • Session • Schedule • Speaker • Attendee Notes • Attendee Schedule • ... and on and onFriday, March 8, 13
  • 22. PFObject • Key-Value pairs • Schema-less • JSON data types: NSString, NSNumber, NSDate, NSData, NSArray, NSDictionary • Associations - 1:1, 1:N, N:N • objectId, updatedAt, createdAtFriday, March 8, 13
  • 23. PFObject PFObject *speaker = [PFObject objectWithClassName:@"Speaker"]; [speaker setObject:@"Marty" forKey:@"firstName"]; [speaker setObject:@"McFly" forKey:@"lastName"]; [speaker setObject:@"Hill Valley, CA" forKey:@"location"]; NSLog(@"Object ID before save: %@", speaker.objectId); [speaker save]; // MAGIC HAPPENS HERE NSLog(@"Object ID after save: %@", speaker.objectId); 2013-03-03 16:19:08.923 CocoaConfParse[4803:c07] Object ID before save: (null) 2013-03-03 16:19:09.468 CocoaConfParse[4803:c07] Object ID after save: 6iXsTrvWd0Friday, March 8, 13
  • 24. Back on Parse.com...Friday, March 8, 13
  • 25. Refresh [speaker refresh]; [speaker refresh:&error]; [speaker refreshInBackgroundWithBlock:^(PFObject *object, NSError *error) { // Code }];Friday, March 8, 13
  • 26. Removing Data [speaker removeObjectForKey:@"favoriteStarWarsCharacter"]; [speaker deleteInBackground];Friday, March 8, 13
  • 27. Relationships PFObject *session = [PFObject objectWithoutDataWithClassName:@"Session" objectId:@"6iXsTrvWd0"]; [sessionComment setObject:session forKey:@"session"]; PFObject *session = [sessionComment objectForKey:@"session"]; [session fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error) { NSString *title = [post objectForKey:@"title"]; }];Friday, March 8, 13
  • 28. Query by ID PFQuery *query = [PFQuery queryWithClassName:@"Speaker"]; PFObject *object = [query getObjectWithId:@"jFgtbb2aCb"]; NSLog(@"Name: %@ %@", object[@"firstName"], object[@"lastName"]); 2013-03-03 17:08:52.484 CocoaConfParse[6892:c07] Name: Marty McFlyFriday, March 8, 13
  • 29. Querying PFQuery *query = [PFQuery queryWithClassName:@"Speaker"]; [query whereKey:@"lastName" equalTo:@"McFly"]; query.cachePolicy = kPFCachePolicyNetworkElseCache; PFObject *object = [query getFirstObject]; NSLog(@"Name: %@ %@", object[@"firstName"], object[@"lastName"]); 2013-03-03 17:08:52.484 CocoaConfParse[6892:c07] Name: Marty McFlyFriday, March 8, 13
  • 30. Queries • NSPredicate • 1000 records max (100 default) • Relational queries • Cache policiesFriday, March 8, 13
  • 31. Asynchronous PFObject *speaker = ...; [speaker save]; [speaker saveEventually]; [speaker saveInBackground]; [speaker saveInBackgroundWithBlock: ^(BOOL succeeded, NSError *error){}];Friday, March 8, 13
  • 32. Users [PFUser enableAutomaticUser]; PFUser *currentUser = [PFUser currentUser]; [currentUser setObject:[NSDate date] forKey:@"lastLaunched"]; [currentUser saveInBackground]; PFUser *user = [PFUser user]; user.username = @"martymcfly"; user.password = @"awesomesauce"; [user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { }]; [PFUser logInWithUsernameInBackground:@"martymcfly" password:@"awesomesauce" block:^(PFUser *user, NSError *error) { }];Friday, March 8, 13
  • 33. ACLs PFObject *feedback = [PFObject objectWithClassName:@"SessionFeedback"]; [feedback setObject:@"I enjoyed it." forKey:@"comment"]; feedback.ACL = [PFACL ACLWithUser:[PFUser currentUser]]; [feedback saveInBackground];Friday, March 8, 13
  • 34. Built-In ViewsFriday, March 8, 13
  • 35. App Structure • Where does Parse start & end? • Service Layers • Parse everywhereFriday, March 8, 13
  • 36. Data Transfer Objects • Map PFObject to some object in your code • Parse is contract/schema-freeFriday, March 8, 13
  • 37. Push Notifications • Still requires APN setup • Simplifies addressing & registration • Cross platform (Android & iOS)Friday, March 8, 13
  • 38. Push Registration - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // Store the deviceToken in the current // Installation and save it to Parse. PFInstallation *currentInstallation = [PFInstallation currentInstallation]; [currentInstallation setDeviceTokenFromData:deviceToken]; [currentInstallation saveInBackground]; }Friday, March 8, 13
  • 39. Channels PFInstallation *currentInstallation = [PFInstallation currentInstallation]; [currentInstallation addUniqueObject:@"Speakers" forKey:@"channels"]; [currentInstallation saveInBackground]; PFPush *push = [[PFPush alloc] init]; [push setChannel:@"Speakers"]; [push setMessage:@"Thanks for all the fish!"]; [push sendPushInBackground];Friday, March 8, 13
  • 40. In-App Purchases • Wraps StoreKit • Receipt verification • Asset download • PFProductTableViewControllerFriday, March 8, 13
  • 41. What about server-side calls?Friday, March 8, 13
  • 42. • Create new speakers & sessions • Attendees register preferences • Push notifications when session changes • Welcome emailsFriday, March 8, 13
  • 43. Cloud Code lets you deploy server-side codeFriday, March 8, 13
  • 44. Cloud Code • RESTful API • JavaScript Language • Triggers & Validation • ModulesFriday, March 8, 13
  • 45. Installing the CL Tool $ curl -s https://www.parse.com/downloads/cloud_code/ installer.sh | sudo /bin/bash $ parse new CocoaConfCloudCode Email: astralbodies@gmail.com Password: 1:CocoaConf Select an App:1 $ cd CocoaConfCloudCodeFriday, March 8, 13
  • 46. $ vi cloud/sessions.js Parse.Cloud.define("numberOfSpeakers", function(request, response) {   var query = new Parse.Query("Speaker");   query.find({     success: function(results) {       response.success(results.count);     },     error: function() {       response.error("Speaker lookup failed");     }   }); });Friday, March 8, 13
  • 47. $ parse deploy $ curl -X POST   -H "X-Parse-Application-Id: MN28ox..."   -H "X-Parse-REST-API-Key: RItKo..."   -H "Content-Type: application/json"   -d {}   https://api.parse.com/1/functions/numberOfSpeakers {   "result": 1 }Friday, March 8, 13
  • 48. Friday, March 8, 13
  • 49. ModulesFriday, March 8, 13
  • 50. Cloud Code • Still in its infancy • No scheduled events • Take a look at iron.ioFriday, March 8, 13
  • 51. Cost • Free (1 million API requests / Pushes / 1GB) • $199/month (15mil / 5mil / 10GB) • Enterprise >$199Friday, March 8, 13
  • 52. Portability • Import • Export • Service layer to abstract • Never really want to lock into a technologyFriday, March 8, 13
  • 53. CodeFriday, March 8, 13
  • 54. Questions?Friday, March 8, 13