Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Extending RubyMotion With Gems and Pods

Ray Hightower
February 16, 2013

Extending RubyMotion With Gems and Pods

Presented at http://snow-mobile.org on February 16, 2013.

RubyMotion enables developers to write native iOS apps using the Ruby language. Developers can amplify the power of RubyMotion by using of some of the available libraries, packaged as Gems and Pods. This talk will demonstrate some of the more popular libraries, while highlighting some of the "gotchas". The first eight minutes will introduce RubyMotion for those who are unfamiliar with it. The remainder of the talk will feature demos of the libraries in action, live coding, and a generous helping of TDD. To get the most out of the talk, the audience member should have some experience programming iOS, Ruby, or both.

Ray Hightower

February 16, 2013
Tweet

More Decks by Ray Hightower

Other Decks in Technology

Transcript

  1. ~/Code/Ruby/RubyMotion$ motion create helloruby Create helloruby Create helloruby/.gitignore Create helloruby/Rakefile

    Create helloruby/app Create helloruby/app/app_delegate.rb Create helloruby/resources Create helloruby/spec Create helloruby/spec/main_spec.rb ~/Code/Ruby/RubyMotion$
  2. ~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app

    # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$
  3. ~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app

    # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$
  4. ~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app

    # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$
  5. ~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app

    # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$
  6. 1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window =

    UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 7 @window.backgroundColor = UIColor.grayColor 8 9 true 10 end 11 end 1 class AppDelegate
  7. 1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window =

    UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 7 @window.backgroundColor = UIColor.grayColor 8 9 true 10 end 11 end 2 def application(application, didFinishLaunchingWithOptions:launchOptions)
  8. 1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window =

    UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 7 @window.backgroundColor = UIColor.grayColor 8 9 true 10 end 11 end 3 @window = UIWindow.alloc.initWithFrame (UIScreen.mainScreen.bounds)
  9. 1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window =

    UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 7 @window.backgroundColor = UIColor.grayColor 8 9 true 10 end 11 end 4 @window.rootViewController = HomeController.new
  10. 1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window =

    UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 7 @window.backgroundColor = UIColor.grayColor 8 9 true 10 end 11 end 5 @window.makeKeyAndVisible
  11. 1 class AppDelegate 2 def application(application, didFinishLaunchingWithOptions:launchOptions) 3 @window =

    UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds) 4 @window.rootViewController = HomeController.new 5 @window.makeKeyAndVisible 6 7 @window.backgroundColor = UIColor.grayColor 8 9 true 10 end 11 end 7 @window.backgroundColor = UIColor.grayColor
  12. ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app # !"" app_delegate.rb

    # $"" home_controller.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 4 files ~/Code/Ruby/RubyMotion/helloruby$
  13. 1 class HomeController < UIViewController 2 def loadView 3 self.view

    = UIView.alloc.init 4 end 5 6 def viewDidLoad 7 label = UILabel.alloc.initWithFrame([[15,100], [280,140]]) 8 label.text = "Hello Ruby!" 9 label.font = UIFont.boldSystemFontOfSize(25) 10 label.textColor = UIColor.blueColor 11 label.textAlignment = UITextAlignmentCenter 12 view.addSubview(label) 13 end 14 15 end 1 class HomeController < UIViewController
  14. 1 class HomeController < UIViewController 2 def loadView 3 self.view

    = UIView.alloc.init 4 end 5 6 def viewDidLoad 7 label = UILabel.alloc.initWithFrame([[15,100], [280,140]]) 8 label.text = "Hello Ruby!" 9 label.font = UIFont.boldSystemFontOfSize(25) 10 label.textColor = UIColor.blueColor 11 label.textAlignment = UITextAlignmentCenter 12 view.addSubview(label) 13 end 14 15 end 2 def loadView
  15. 1 class HomeController < UIViewController 2 def loadView 3 self.view

    = UIView.alloc.init 4 end 5 6 def viewDidLoad 7 label = UILabel.alloc.initWithFrame([[15,100], [280,140]]) 8 label.text = "Hello Ruby!" 9 label.font = UIFont.boldSystemFontOfSize(25) 10 label.textColor = UIColor.blueColor 11 label.textAlignment = UITextAlignmentCenter 12 view.addSubview(label) 13 end 14 15 end 6 def viewDidLoad
  16. 1 class HomeController < UIViewController 2 def loadView 3 self.view

    = UIView.alloc.init 4 end 5 6 def viewDidLoad 7 label = UILabel.alloc.initWithFrame([[15,100], [280,140]]) 8 label.text = "Hello Ruby!" 9 label.font = UIFont.boldSystemFontOfSize(25) 10 label.textColor = UIColor.blueColor 11 label.textAlignment = UITextAlignmentCenter 12 view.addSubview(label) 13 end 14 15 end 7 label = UILabel.alloc.initWithFrame( [[15,100],[280,140]])
  17. ~/Code/Ruby/RubyMotion/fizzbuzzrm[master]$ tree . !"" Gemfile !"" Gemfile.lock !"" Guardfile !""

    Rakefile !"" app # !"" app.rb # !"" app_delegate.rb # !"" fizzbuzz_view_controller.rb # !"" home_controller.rb # !"" kernel.rb # !"" rm-ansiterm.rb # $"" string.rb !"" interfaces !"" resources # !"" f.png # !"" fbib.xib # !"" fizzbuzzbackground.jpg # $"" fizzbuzzbackground.png $"" spec !"" 00-redgreen.rb !"" home_controller_spec.rb $"" main_spec.rb 4 directories, 18 files ~/Code/Ruby/RubyMotion/fizzbuzzrm[master]$ $" spec !" 00-redgreen.rb !" home_controller_spec.rb $" main_spec.rb
  18. 1 describe "FizzBuzz Calculator Function" do 2 before do 3

    @this_number = 38 4 end 5 ... 17 18 (1..10).each do |this_number| 19 if this_number % 15 == 0 20 it 'should return buzz for multiples of 15' do 21 HomeController.fizzbuzz_calc(this_number).should == 'fizzbuzz' 22 end 23 elsif this_number % 3 == 0 24 it 'should return fizz for multiples of 3' do 25 HomeController.fizzbuzz_calc(this_number).should == 'fizz' 26 end 27 elsif this_number % 5 == 0 28 it 'should return buzz for multiples of 5' do 29 HomeController.fizzbuzz_calc(this_number).should == 'buzz' 30 end 31 else 32 it 'should return the original number' do 33 HomeController.fizzbuzz_calc(this_number).should == this_number 34 end 35 end 36 end 37 end home_controller_spec.rb
  19. describe "FizzBuzz Calculator Function" do before do @this_number = 38

    end ... (1..10).each do |this_number| if this_number % 15 == 0 it 'should return buzz for mults of 15' do HomeController.fizzbuzz_calc(this_number) .should == 'fizzbuzz' end home_controller_spec.rb
  20. ~/Code/Ruby/RubyMotion$ cd helloruby/ ~/Code/Ruby/RubyMotion/helloruby$ tree . !"" Rakefile !"" app

    # $"" app_delegate.rb !"" resources $"" spec $"" main_spec.rb 3 directories, 3 files ~/Code/Ruby/RubyMotion/helloruby$
  21. 1 class FizzBuzzViewController < UIViewController 2 3 def loadView 4

    views = NSBundle.mainBundle.loadNibNamed "fbib", owner:self, options:nil 5 self.view = views[0] 6 @counter = 0 7 @view_handle = self.view 8 end 4 views = NSBundle.mainBundle.loadNibNamed"fbib", owner:self, options:nil
  22. 10 def viewDidLoad 11 @label = view.viewWithTag 1 12 plus_button

    = view.viewWithTag 2 13 minus_button = view.viewWithTag 3 14 reset_button = view.viewWithTag 4 15 end
  23. 1 $:.unshift("/Library/RubyMotion/lib") 2 require 'motion/project' 3 require "bundler/gem_tasks" 4 require

    "bundler/setup" 5 6 $:.unshift("./lib/") 7 require './lib/formotion' 8 9 Motion::Project::App.setup do |app| 10 # Use `rake config' for project settings. 11 app.name = 'Formotion' 12 end Rakefile Source: http://clayallsopp.com
  24. 1 class LoginController < Formotion::FormController 2 def init 3 form

    = Formotion::Form.new({ 4 title: "Login", 5 sections: [{ 6 rows: [{ 7 title: "User Name", 8 type: :string, 9 placeholder: "name", 10 key: :user 11 }, { 12 ... login_controller.rb Source: http://clayallsopp.com
  25. 2 $:.unshift("/Library/RubyMotion/lib") 3 require 'motion/project' 4 require 'bubble-wrap/core' 5 require

    'bubble-wrap/http' 6 7 Motion::Project::App.setup do |app| 8 # Use `rake config'... 9 app.name = 'NSScreencast' 10 end Rakefile Source: Ben Scheirman of http://nsscreencast.com/
  26. 1 class ApiClient 2 def self.fetch_episodes(&block) 3 @myurl = "http://nsscreencast.com/api/episodes.json"

    4 BubbleWrap::HTTP.get(@myurl) do |response| 5 if response.ok? 6 json = BubbleWrap::JSON.parse(response.body) 7 episodes = json.map {|ej| Episode.from_json(ej["episode"])} 8 block.call(true, episodes) 9 else 10 block.call(false, nil) 11 end 12 end 13 end 14 end api_client.rb Source: Ben Scheirman of http://nsscreencast.com/
  27. ~/Code/Ruby/RubyMotion$ ios profiles:list +----------------------------------+--------------+---------+ | Profile | App ID |

    Status | +----------------------------------+--------------+---------+ | WisdomGroup iOS Development | ABCDEFGHIJ.* | Active | | WisdomGroup RubyMotion | ABCDEFGHIJ.* | Active | | ChicagoRubyRubyMotion iPad | ABCDEFGHIJ.* | Active | | iOS Team Provisioning Profile: * | ABCDEFGHIJ.* | Active | | RTHiPhone4S | ABCDEFGHIJ.* | Active | +----------------------------------+--------------+---------+ ~/Code/Ruby/RubyMotion$ ios help
  28. Resources http://rubymotion-tutorial.com Multi-page tutorial by Clay Allsopp. Also see http://clayallsopp.com

    http://pragmaticstudio.com/screencasts/rubymotion Pragmatic Studio’s intro to RubyMotion (free) plus a paid intro to Ruby. http://chicagoruby.org/videos/archives/2012/09/04/rubymotion-for-rubyists/ Bill Svec builds a simple RubyMotion weather app in about 90 minutes. http://motioncasts.tv Tutorial videos by Michael Erasmus and Hendrik Swanepoel. http://nshipster.com Mattt Thompson's weekly journal of Objective-C and Cocoa. http://nsscreencast.com/ Ben Scheirman’s Objective-C screencasts, plus a short one on RubyMotion.