RubyMotion事始め

# はじめに

今まではサーバーサイドの開発が主だったのですが、思い立って[RubyMotion](http://www.rubymotion.com/)を始めて見ました。

# プロジェクトの開始

プロジェクトの開始は`motion create`コマンドで行います。

```
motion create sample
```

これで初期のファイルが作成されます。

```
Create sample
Create sample/.gitignore
Create sample/app/app_delegate.rb
Create sample/Gemfile
Create sample/Rakefile
Create sample/resources/Default-568h@2x.png
Create sample/spec/main_spec.rb
```

## `app/app_delegate.rb`

```ruby
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    true
  end
end
```

# 初めてのビルド

プロジェクトディレクトリに移動して`rake`コマンドでビルドしてみます。

```
cd sample
rake
```

ビルドされて、自動的にシミュレーターが立ち上がります。

```
     Build ./build/iPhoneSimulator-7.1-Development
   Compile ./app/app_delegate.rb
    Create ./build/iPhoneSimulator-7.1-Development/sample.app
      Link ./build/iPhoneSimulator-7.1-Development/sample.app/sample
    Create ./build/iPhoneSimulator-7.1-Development/sample.app/PkgInfo
    Create ./build/iPhoneSimulator-7.1-Development/sample.app/Info.plist
      Copy ./resources/Default-568h@2x.png
    Create ./build/iPhoneSimulator-7.1-Development/sample.dSYM
  Simulate ./build/iPhoneSimulator-7.1-Development/sample.app
(main)>
```

なにもコードを追加していないので、真っ黒なシミュレーターが現れます。

# 外部ライブラリの利用 Gem編

RubyMotionは外部のライブラリを用いることも容易です。
CRubyのライブラリをそのまま使えるわけではありませんが、RubyMotion用Gemも豊富に用意されています。

使いたいライブラリを`Gemfile`に追記しましょう。
今回は[ProMotion](https://github.com/clearsightstudio/ProMotion)を使用してみます。

## `Gemfile`

```ruby
source 'https://rubygems.org'

gem 'ProMotion'
```

`Gemfile`に依存関係を記述したら`bundle install`コマンドでライブラリをインストールします。
グローバルに入れない場合は`bundle install --path vendor/bundle`など、インストールパスを指定しましょう。

`Rake`ファイルに`bundler`を使う設定がなされていれば、`bundle exec rake`としなくとも`rake`コマンドだけでタスクを実行できます。  


## `Rakefile`

```ruby
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project/template/ios'

begin
  require 'bundler'
  Bundler.require
rescue LoadError
end

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'sample'
end
```

# ProMotionをつかってみる

`bundler`で`ProMotion`をインストールできたので、
画面を作ってみます。

## `app/app_delegate.rb`

```ruby
class AppDelegate < PM::Delegate
  def on_load(app, options)
    open RootScreen.new(nav_bar: true)
  end
end
```

## `app/screens/root_screen.rb`

```ruby
class RootScreen < PM::Screen
  title "Root Screen"

  def on_load
    set_nav_bar_button :right, title: "Help", action: :open_help_screen
  end

  def open_help_screen
    open HelpScreen
  end
end
```

## `app/screens/help_screen.rb`

```ruby
class HelpScreen < PM::TableScreen
  title "Table Screen"

  def table_data
    [{
      title: "Help",
      cells: [
        { title: "About this app", action: :tapped_about },
        { title: "Log out", action: :log_out }
      ]
    }]
  end

  def tapped_about(args={})
    open AboutScreen
  end

  def log_out
    # Log out!
  end
end
```

これで`rake`すれば、画面のあるアプリが立ち上がります。
すこしアプリ開発っぽくなってきましたね。

![promotion](http://k-shogo.github.io/images/2014-04-08-rubymotion-get-started/promotion.png)

# CocoaPodsの利用

RubyMotionでも[CocoaPods](http://cocoapods.org/)で管理されているライブラリも利用することが可能です。
`Gemfile`に[motion-cocoapods](https://github.com/HipByte/motion-cocoapods)を追加します。

## `Gemfile`

```ruby
source 'https://rubygems.org'

gem 'ProMotion'
gem 'motion-cocoapods'
```

`Rakefile`の中で`app.pods`ブロックにてCocoaPodsライブラリとの依存関係を記述します。

## `Rakefile`

```ruby
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project/template/ios'

begin
  require 'bundler'
  Bundler.require
rescue LoadError
end

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'sample'

  app.pods do
    pod 'AFNetworking'
  end
end
```

`rake`タスクに`pod:install`が追加されているので、CocoaPods管理ライブラリをインストールできます。
（初めてCocoaPodsを使う場合は先に`bundle exec pod setup`）

```
rake pod:install
```

これで`vendor/Pods`以下にインストールされ、ビルド時にリンクされるようになります。