RoR to RubyMotionWriting Your First iOS App
With RubyMotion
Michael DenomyBostonMotion User GroupJune 25, 2013
About Me
• Tech Lead at Cyrus Innovation- Agile web consultancy with offices in New
York and Boston
- http://www.cyrusinnovation.com
• Agile and XP practitioner since 2004- Passionate about TDD and pairing
• mdenomy on twitter and github
• Blog at www.mdenomy.wordpress.com
Goals• Capture my experiences getting started
with RubyMotion- Help someone else along
- Get ideas for where to go next
• Target Audience- Developers familiar with Ruby on Rails
- Little to no previous experience with iOS
- Desire to learn
• Some talk, some code
The VisionMVC
Ruby
The Reality initWithNibName?
UIControlEventTouchUpInside?What’s a Nib?
More Cold Hard Facts• RubyMotion is not free- $199.99
- No trial, but 30 day money back
- There is a student discount program
• iOS Developer Program is not free- $99 / year
- Required to deploy to devices and distribute via AppStore
• You will need to understand iOS SDK- iOS documentation is difficult to navigate
It Gets Better
It Gets Better
Good Stuff• Growing community with lots of online
resources
• More and more gems appearing that provide a Rails-like experience
• Free to use the tools you like- Sublime plug in for RubyMotion has code
completion and rake shortcuts
https://github.com/haraken3/SublimeRubyMotionBuilder
MVC in iOS• MVC is MVC right?
• No “convention over configuration”- Have to wire things up manually
• Slightly different terminology that Rails
UIViewControllers• Controller receives actions from the
framework (e.g. view loaded) and the user (e.g. button pressed)- Interacts with Models and View
• UIViewControllers you need to know- UINavigationController
- UITabBarController
- UIViewController
- UITableViewController
Models• Models are PORO’s in RubyMotion
• Support built-in for - attr_accessor
- attr_reader
- attr_writer
• Possible to serialize/deserialize data using NSCoder and NSKeyedArchiver- Looked for other options to support storage
and relationships
Views• UIView is a base class
• Buttons, labels, date pickers, etc., all inherit from UIView
• Views can have subviews- Simplifies screen layout and allows re-use
Let’s Look at Some Code• Basic Navigation- Application Delegate
- Root View Controller
- UITabBarController
- UIViewControllers
MyWines App• I enjoy the occasional glass of wine.
• I would like to have a way to track the wines I like and prices I've paid for them- Record tasting notes
- Record purchases and price info
- Search for wine by name/producer
- Save to Favorites
- Save label picture
• Spoiler alert- I have done next to nothing to style the app
Sketch It Out
It’s a lot cheaper and faster to iterate at this level than in code
What Tools Did I Choose• Bundler - Simplify dependencies
• ProMotion - Screen development and workflow
• Formotion - Entry/edit forms
• MotionModel - Models and relations
• Teacup - Styling DSL
• Sugarcube - UI extensions
• BubbleWrap - I used it for camera, but lots more (JSON, HTTP, RSS, Location, Audio, Video)
• MotionAwesome - Buttons and icons
More at http://rubymotion-wrappers.com/
ProMotion• Simplifies screen development
• Support for table screens- Easily search for table entries
• Helpers for tab and navbar controllers
Formotion• Easily create forms
for entry/edit
• Integrates with ProMotion
• Support For- text
- dates
- sliders
- check boxes
- and many more
MotionModel•Wanted something like ActiveRecord
• Chose MotionModel gem- Lightweight
- Feels Railsy‣ Validations
‣ ActiveRecord-like syntax
‣ Relations
- Serialization / deserialization support
- Actively maintained
- Formotion support(turned out not to matter)
Teacup• Layout and style
your app in a DSL
• Frees you up from layout of screens in XCode
• Allows you to keep your views a lot cleaner
• Hierarchical and supports variables
Sugarcube• Tons of helpful ‘syntactic sugar’ extensions
to make your development easier- conversion of hex color codes to UIColor
- alert and action dialogs
- symbol to iOS, e.g.,‣ :touch.uicontrolevent becomes UIControlEventTouchUpInside
- array helpers
- hash to object conversions
BubbleWrap • Amazing set of tools for- HTTP
- JSON
- RSS
- Camera
- Location
- Alert boxes
- REPL support
• Just using it for the camera in my app
MotionAwesome• Great set of icons and buttons
• Based on FontAwesome
• So far only used it to create a camera button using a camera icon
Deploying to Device• Must be in Apple Developer Program- $99/year
• Get provisioning and developer certificates
• Deploy using rake- rake device
- Make sure to quit iTunes and Image Capture
• Can’t do some things with simulator- e.g. Camera
Where Do I Go Next• Better use of views and subviews- As app evolves will have more common
controls/groups -> re-use
- Easier to lay out due to relative positioning used in subviews
• Better/more styling- Will require more understanding of iOS
• Persist images to file system
• Do more with models- Averages, filtering, etc
Where Do I Go Next• Testing- This was very much a spike, but as the app
evolves want to incorporate more automated testing
- Tested the models, especially persistence and validation since these were areas of risk
- Want to look at more integration testing‣ motion-frank (maintained by Cyrus Innovation)
‣ motion-calabash
Questions I Still Have• ProMotion is awesome, but I wonder if
down the road this paints me into a corner
•Wild West of gems- Will be interesting to see what ideas and
tools rise to the top
• How much iOS should I learn- Interface Builder
- CoreData
Resources• RubyMotion Developer Center- http://www.rubymotion.com/developer-center/
• RubyMotion by Clay Allsop- http://pragprog.com/book/carubym/rubymotion
• iOS Dev Center- Tons of useful info, navigation is horrible- https://developer.apple.com/devcenter/ios/index.action
- https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS
• RubyMotion Wrappers and Libraries- http://rubymotion-wrappers.com/
Questions • Q&A
RoR to RubyMotionWriting Your First iOS App
Michael DenomyBostonMotion User GroupJune 25, 2013
Top Related