lessons from developing an iphone app + server backend
DESCRIPTION
I share some of the lessons learned while building an iphone app (Discounts For Me) and building the server back end in ruby on rails. This one geared more towards rails programmers. (presented at Silicon Valley Ruby Meetup on Sept 2009) web : http://discountsforme.net/TRANSCRIPT
![Page 1: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/1.jpg)
Lessons from developing anIphone App + Server backend
Sujee [email protected]://sujee.nethttp://DiscountsForMe.netSep 2009
![Page 2: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/2.jpg)
Target Audience
• Iphone app developers• Server backend developers
for mobile apps• Expert level:
Beginner - Intermediate
![Page 3: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/3.jpg)
My Background
• Developer (enterprise, web)• Java / Php / Ruby• First iphone/mobile app
![Page 4: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/4.jpg)
App: DiscountsForMe
• Shows member benefits• Based on location• V2.0 in app store• Memberships:– Public radio (KQED, WHYY)– Bank of America card– AAA, AARP– More…
![Page 5: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/5.jpg)
![Page 6: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/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 an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/7.jpg)
Connectivity : Simple Start
• First cut : App made three server calls at startup– ping()– get_A()– get_B()
• Simulator • Iphone over Wi-fi• Iphone over 3G • LAG-TIME is a problem
![Page 8: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/8.jpg)
Connectivity : Minimize Lag Time
• Noticeable lag time over 3G/Edge• Reducing lag time– Download in background– Condense network calls (especially if the user is
waiting for data)• So– Get_A()– Get_B()get_A_and_B()
![Page 9: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/9.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 10: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/10.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/
• Rails makes it real easy to send Json/xml– Some_obj.to_json– Some_obj.to_xml
![Page 11: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/11.jpg)
Keeping it small
• Trim objects– No need to send all attributes– Active records have extra attributes (created_at,
updated_at ..etc)• Example: my_response = {} my_response[:book_name] = book.name my_response[:book_description] = book.description my_response[:author_name] = book.author.name render(:json => my_response.to_json())
- Compress (zip) response
![Page 12: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/12.jpg)
Agenda
• Connectivity• Data format• Secure Data transfer• UDIDs, Keys, analytics• Controlling app from server
![Page 13: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/13.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 14: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/14.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 15: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/15.jpg)
Verify SSL Cert…
![Page 16: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/16.jpg)
Agenda
• Connectivity• Data format• Secure Data transfer• UDIDs, Keys, multiple versions, analytics• Controlling app from server
![Page 17: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/17.jpg)
What do I send to the server?
• Think about including– UDID (device id)– And a Key (compiled within the app)
• http://example.com/iphone/foo?udid=xxxx&key=yyyy
• Why?
![Page 18: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/18.jpg)
Unique Device ID (UDID)
• Each iphone has a unique ID, etched in hardware (just like MAC address)
• Your app can send UDID with each request• Uses– metrics on app usage– Easy account creation (no signup)
![Page 19: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/19.jpg)
Identify a User (Device)
• UDID can help you ‘auto –create’ accounts on server– Eg. High scores of games
• Allow users to create a custom user name later
• Beware of a user using multiple devices (multiple UDIDs)
![Page 20: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/20.jpg)
Metrics
• A) Client Side metrics– Code embedded in your iphone app– Users (new, repeat), session length– Few companies (Flurry, Pinch Media ..etc)
• Server side metrics– Response time– Response size– Other
![Page 21: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/21.jpg)
Metrics : Client Side
![Page 22: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/22.jpg)
Server Side Metric : Response Time
• Log every thing in PARAMS plus more• E.g. Want to measure the time spent on each
request• use around_filter in Controller
class MyControlleraround_filter :log_access, :only =>
[:get_A]
![Page 23: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/23.jpg)
Response Time …
def log_access start_time = Time.now yield end_time = Time.now elapsed = ((end_time - start_time)*1000.0).to_int
End
![Page 24: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/24.jpg)
Response Size
def log_access start_time = Time.now yield end_time = Time.now elapsed = ((end_time - start_time)*1000.0).to_int
response_data_size = response.body.lengthEnd
![Page 25: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/25.jpg)
Response Time Chart
Time (ms)
![Page 26: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/26.jpg)
Response Size Chart
• Response size (kbytes)
![Page 27: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/27.jpg)
Access keys
• Keys are random, ‘sekret’ strings compiled into the iphone app
• Sample key = “iphone_v1.0_xklajdfoi2” (human readable + ‘hard to guess’)
• Start using ‘access keys’ from day-1• Each request to server must have a valid key• Uses– Easy to control client access (Prevent scraping, DOS ..etc)– Monitoring (what versions are being used)– Support multiple versions, easy upgrade
![Page 28: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/28.jpg)
Access Keys
In controller: @@keys = [ "iphone_v0.0_foobar” , "iphone_v1.0_afajiu” , "iphone_v2.0_fi98d”, "iphone_v2.0_plus_fsafa” , "android_v1.0_fasjlkuo” ]
@@keys_premium = ["iphone_v2.0_plus_fsfa"]
![Page 29: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/29.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 30: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/30.jpg)
Supporting multiple clients…
![Page 31: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/31.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 32: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/32.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 33: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/33.jpg)
Example : Controllers
• MobileController– IPhoneController < MobileController– AndroidController < MobileController
• Most of the shared logic in ‘MobileController’
![Page 34: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/34.jpg)
Example …Class MobileController @@valid_keys = [……] def ping
to_ret = {} begin
validate to_ret[:status] = “OK”
rescue to_ret[:error] = $1.message
end render (:json => to_ret.to_json)
endend
![Page 35: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/35.jpg)
Example …Def validate #verify the key if (params[:key].blank?) raise DiscountsError, "dude, where is my key?" end if (params[:uid].blank?) raise DiscountsError, "dude, who are you?" end unless (@@valid_keys .has_key?(params[:key])) raise DiscountsError, "un supported version, please upgrade" end endend
![Page 36: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/36.jpg)
Controlling app behavior from Server
![Page 37: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/37.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 38: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/38.jpg)
Control…
• One example: Choosing if you are going to show ads?– show_ads : {none | admob | tapjoy}
![Page 39: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/39.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 40: Lessons from developing an Iphone App + Server backend](https://reader033.vdocuments.site/reader033/viewer/2022060115/557cb2f9d8b42abf328b4d4b/html5/thumbnails/40.jpg)
Thanks!
• Sujee Maniyam– [email protected]– http://sujee.net
• http://DiscountsForMe.net
• Questions?