![Page 1: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/1.jpg)
Lessons from developing anIphone App + Server backend
Sujee [email protected]://sujee.nethttp://DiscountsForMe.netAug 2009
![Page 2: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/2.jpg)
Target Audience
• Iphone app developers• Server backend developers
for mobile apps• Expert level:
Beginner - Intermediate
![Page 3: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/3.jpg)
My Background
• Developer (enterprise, web)• Java / Php / Ruby• First iphone/mobile app
![Page 4: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/4.jpg)
App: DiscountsForMe
• Shows member benefits• Based on location• V1.0 in app store• Memberships:– Public radio (KQED)– Bank of America card– AAA, AARP– More…
![Page 5: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/5.jpg)
![Page 6: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/6.jpg)
Architecture
• Server (DiscountsForMe.net) serves data• Server is Rails app• Iphone app talks to the server• <Insert usual
SERVER ---- INTERNET CLOUD ---- IPHONEpicture here>
![Page 7: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/7.jpg)
Agenda
• Connectivity• Data format• Secure Data trasnfer• UDIDs & Keys• Controlling app from server
![Page 8: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/8.jpg)
Connectivity : Simple Start
• App makes three server calls– ping()– get_memberships()– get_discounts(my_location, my_memberships)
• Simulator • Iphone over Wi-fi• Iphone over 3G • LAG-TIME is a problem
![Page 9: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/9.jpg)
Connectivity : Minimize Lag Time
• Noticeable lag time over 3G/Edge• Reducing lag time– Condense network calls (especially if the user is
waiting for data)– Download in background
• So– Get_memberships()– Get_discounts(my_location, my_memberships) get_memberships_and_discounts(loc, mymems)
![Page 10: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/10.jpg)
Iphone Connectivity
• BIG LESSON 1 : – Test on IPHONE (not just simulator)– Test with WiFi OFF! (3G can be slow to connect,
EDGE even worse)– You may need to reorganize the logic to improve
response time (I had to)
• LESSON 2– Test in AirPlane Mode (all RADIOS off)
(a frequent reason network apps are rejected )
![Page 11: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/11.jpg)
Connectivity Test
• Quick Ping– Which is faster?• httpS://www.DiscountsForMe.net/ping• http://www.google.com
– SSL always takes longer to establish connection– Use faster sites
• Another snippet from Erica Sadun’s book(to be verified)
![Page 12: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/12.jpg)
Talking to Server : Format
• Two choices : XML, JSON
•JSON smaller size than XML (50% less)
• Json : use TouchJSON library http://code.google.com/p/touchcode/wiki/TouchJSON
• XML : NSXML(sdk) / TouchXML / KissXMLhttp://www.71squared.co.uk/2009/05/processing-xml-on-the-iphone/
![Page 13: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/13.jpg)
Agenda
• Connectivity• Data format• Secure Data transfer• UDIDs, Keys, analytics• Controlling app from server
![Page 14: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/14.jpg)
Secure Data Transfer
• Plain HTTP is fine most of the time• If you want to secure data– Symmetric key encryption (shared ‘seckr3t’ key on
Iphone app and server)– Public-private key encryption (e.g. SSH) : private
key on server, public key on iphone– httpS
![Page 15: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/15.jpg)
Secure data transfer : httpS
• SSL is ‘good enough’ for most of us• Get a proper SSL certificate ($30). Self-signed
certs don’t work by default• Beware connection time is a little longer for
httpS• Verify your ssl certificate is installed properly
http://www.digicert.com/help/
![Page 16: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/16.jpg)
Verify SSL Cert…
![Page 17: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/17.jpg)
Talking to Server : POST reqNSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url];[request setHTTPMethod:@"POST"];NSMutableString *postString = [NSMutableString string];[postString appendFormat:@"%@=%@&", key, value];NSString *postString2 = [postString
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];[request setHTTPBody:[postString2
dataUsingEncoding:NSUTF8StringEncoding]];
NSURLResponse *response = nil;NSError *error = nil;NSData *data = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response error:&error];
![Page 18: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/18.jpg)
Talking to Server : Local Server
#ifdef DEBUG// dev#define MEMBER_SERVER @”http://localhost:3000
”#else// production#define MEMBER_SERVER @
”https://discountsforme.net”#endif
- And define ‘DEBUG’ in build configurations
![Page 19: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/19.jpg)
Talking to Server : Dedicated Class- Don’t do URL connections all over the code. Have a class do it- Easy to debug- Use named methods (getDiscounts Vs connectToURL)
@interface ServerConnection : NSObject {}+ (BOOL) testConnectivity;+ (BOOL) isConnected;+ (NSArray *) getMemberships;+ (NSArray *) getDiscounts:(NSDictionary *) params;@end
![Page 20: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/20.jpg)
Agenda
• Connectivity• Data format• Secure Data transfer• UDIDs, Keys, multiple versions, analytics• Controlling app from server
![Page 21: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/21.jpg)
What do I send to the server?
• get_memberships()• No parameters?...• Think about including– UDID (device id)– And a Key (compiled within the app)
• http://discountsforme.net/iphone/get_memberships
• http://discountsforme.net/iphone/get_memberships?udid=xxxx&key=yyyy
![Page 22: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/22.jpg)
Server Side : Unique Device ID
• Each mobile device has a uniq ID, etched in hardware (just like MAC address)
• Your app can send UDID with each request• Of course : encrypt it or via SSL• Very useful for metrics on app usage– How many unique devices have the app– Access patterns (repeat uses)
• Easy account creation (no signup)
![Page 23: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/23.jpg)
Server side : access keys
• Start using ‘access keys’ from day-1• Sample key = “iphone_v1.0_xklajdfoi2”
(human readable + hard to guess)• Each request to server must have a valid key• Easy to control client access– Prevent scraping, DOS ..etc
• Monitoring (what versions are being used)• Support multiple versions, easy upgrade
![Page 24: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/24.jpg)
Supporting multiple versions
• May be supporting 2-3 client versions at a time (users don’t always run the latest)
• Keep old ‘API’ around, build-out new APIif (is_v2_or_later(key)){ do something }else {do some thing else}
• This can get convoluted (see next page…)
![Page 25: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/25.jpg)
Supporting multiple clients…
![Page 26: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/26.jpg)
Supporting Multiple Clients…
• Have different controllers handle different client versions#define SERVER @”https://foo.com/iphone1”#define SERVER @”https://foo.com/iphone2”
• Make sure to avoid code duplication• Plan-B : End-of-life
If ( ! is_supported_version(key)){ send_msg(“please upgrade”);}
![Page 27: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/27.jpg)
Server side : keeping it secure• Make sure ‘secret stuff’ doesn’t get logged in log-files• In Rails :
class Mobile::MobileController < ApplicationControllerfilter_parameter_logging [:key, :uid]
end
• Output:Processing IphoneController#get_memberships_and_discounts (for
166.137.132.167 at 2009-07-02 16:07:41) [POST] Session ID: 126e5a73742f92f85c1158ea63fd960a Parameters: {"loc"=>"39.282440,-76.765693",
"action"=>"get_memberships_and_discounts", "uid"=>”[FILTERED]", "controller"=>"mobile/iphone", "dist"=>"25", "mems"=>"", "key"=>"[FILTERED]"}
![Page 28: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/28.jpg)
Server side : Metrics : Logs
• Log every thing to database, don’t rely on logfiles
• This gives you pretty good metrics on your app usage
• On Rails, use around_filteraround_filter :log_access, :only => [:get_discounts, :get_memberships]
• Thirdparty metrics : FLURRY, PinchMedia…
![Page 29: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/29.jpg)
Server side : logging in Rails
def log_access start_time = Time.now yield end_time = Time.now elapsed = ((end_time - start_time)*1000.0).to_int begin # b/c we don’t want to error during logging alog = MemberAccessLog.new alog.client_type_id = client_type_id alog.session = session.session_id …. alog.save! rescue endEnd
![Page 30: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/30.jpg)
Logging & Scalability
• If all your requests are READ-ONLY (from db) it is very easy to scale– Load balancer can route requests to any server– Database can be replicated easily
• Write-bound apps are little tricky to scale
![Page 31: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/31.jpg)
Agenda
• Connectivity• Data format• Secure Data transfer• UDIDs, Keys, analytics• Controlling app from server
![Page 32: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/32.jpg)
Controlling app behavior from Server
![Page 33: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/33.jpg)
Control …
• Apps changes are not easy to ‘get out’– Approval process takes time– Users may not upgrade to latest version
• Server changes are under your control and easy to deploy
• So build in control-switches in the app, that can be directed from server
![Page 34: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/34.jpg)
Control…
• One example: Choosing if you are going to show ads?– show_ads : {none | admob | tapjoy}
![Page 35: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/35.jpg)
Hosting
• Shared hosting is fine, but others might swamp your DB, CPU ..etc
• If you can, get a VPS (Virtual Private Server)– Plans start from $20 / month (SliceHost, Hosting-
Rails ..etc)– You have full ROOT access to the server (install
packages, run CRON jobs ..etc)• EC2 is great (for testing, scaling)
![Page 36: Lessons from developing a Client Server Iphone app](https://reader035.vdocuments.site/reader035/viewer/2022070321/5589e958d8b42ac7378b4689/html5/thumbnails/36.jpg)
Thanks!
• Sujee Maniyam– [email protected]– http://sujee.net
• http://DiscountsForMe.net
• Questions?