優點

RubyMotion 的優點說穿了就是儘量讓你不會碰到 Objective-C, Xcode, 及 iOS API 的摧殘:

使用 Ruby 語法

應該不是只有我覺得 Objective-C 的語法很醜,Cocoa/iOS 的 API 也都是囉嗦的長, 但相對地 Ruby 就有漂亮易讀的語法及好用的內建 library。

與其要寫:

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"one", @"two", @"three", @"four", nil];
NSArray *newAdditions = [NSArray arrayWithObjects: @"a", @"b", nil];
NSIndexSet *indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1,newAdditions.count)];
[array insertObjects:newAdditions atIndexes:indexes];

我更喜歡寫:

array = %w{one two three four}
newAdditions = %w{a b}
array.insert(1, *newAdditions)

可利用 RubyMotion gems

RubyMotion Wrappers 可以找到許多專爲 RubyMotion 設計的 gem,通常是把 iOS API 或是有名 的 library (例如 AFNetworking 或 Cocos2D) 包裝成 Ruby 的慣用方式,例如 SugarCube 可以把:

UIApplication.sharedApplication.openURL(NSURL.URLWithString(url))

簡化成:

url.nsurl.open

簡潔好維護的 DSL

例如 Teacup 可以取代用 XIB 來拉 UI:

Teacup::Stylesheet.new(:menu) do
  style :root,
        gradient: {
            colors: ['#7a7a7a'.uicolor, '#414141'.uicolor]
        }

  style :header,
        backgroundColor: 'background-menu-header.png'.uiimage.uicolor,
        constraints: [
            :top_left,
            :full_width,
            constrain_height(59)
        ]

  style :title,
        backgroundColor: UIColor.clearColor,
        frame: CGRectMake(12, 0, 190, 50),
        color: UIColor.whiteColor,
        font: UIFont.boldSystemFontOfSize(18),
        baselineAdjustment: UIBaselineAdjustmentAlignCenters
end

Rakefile

採用 Rakefile 比起用 xcodeproject 更有彈性且好維護,例如我一個 app 有分付費及免費兩個版本,建置時可以用環境變數來切換,Rakefile 可以加入程式邏輯來判斷處理:

Motion::Project::App.setup do |app|
  case APP
  when 'taoyuan'
    app.name = 'TaoyuanAirport'
    app.identifier = 'com.simplypatrick.taoyuanairport.paid'
  when 'taoyuan-free'
    app.name = 'TaoyuanAirport-Free'
    app.identifier = 'com.simplypatrick.taoyuanairport'
  end

  app.deployment_target = '6.0'
  app.version = app.info_plist['CFBundleShortVersionString'] = '1.5.7'

  app.files << Dir.glob("./config/#{APP}/*.rb")
  app.resources_dirs << "./config/#{APP}/resources"

  # ...
end

缺點

反面列一些我覺得是缺點的地方:

額外的 Ruby 學習成本

之前說過,只懂 Ruby 是無法用 RubyMotion 開發 iOS App 的,必須先懂 Objective-C 及 Xcode 後再捨棄它們,對於非 Ruby 愛好者這是比較難接受的。

價格

RubyMotion 並不是免費軟體,第一次購買要 $199 USD,之後每年需要再付 $99 USD 的更新及支持費用,對於只是想嘗試用 Ruby 寫 iOS app 的開發者是個門檻。

App 的大小

RubyMotion 雖然是編譯成 native code,比起用純 Objective-C 開發,層層包裝後產生的 IPA 檔還是大了不少,但我覺得還可以是還可以接受的程度。

結論

如果是熟悉 Ruby 或是想學習 Ruby 的開發者我會蠻推薦 RubyMotion。