1. Creation

RubyMotion の新規プロジェクトを作るには、/usr/bin/motioncreate コマンドを指定します。このコマンドにより新規プロジェクトのディレクトリが作成されます。

$ motion create Hello
$ cd Hello
$ ls
Rakefile app resources spec

1.1. Project Templates

デフォルトでは、motion create は iOS 用のプロジェクトを作成します。motion コマンドは、異なるプロジェクトを作成するために --template= 引数を受け付けます。

現在、RubyMotion には 3 種類の組み込みのテンプレートが同梱しています。

  • ios: RubyMotion iOS プロジェクトを作成します。デフォルトで使用されるテンプレートです。

  • osx: RubyMotion OS X プロジェクトを作成します。

  • gem: RubyMotion Gem プロジェクトを作成します。

たとえば、OS X プロジェクトを作成するには、

$ motion create --template=osx Hello
$ cd Hello

~/Library/RubyMotion/template ディレクトリに 3rd-party のテンプレートを追加できます。RubyMotion プロジェクトのテンプレートは files というサブディレクトリを含み、motion create で作成されるファイルによって構成されます。

/Library/RubyMotion/lib/motion/project/template にある組み込みのテンプレートを参照ください。

1.2. Project Anatomy

下の表は、プロジェクトのディレクトリ構成について示したものです。

File/Directory Purpose

Rakefile

このファイルは、デフォルトのタスクとプロジェクトの設定が記述されています。設定の変更や、新しいタスクを追加できます。

.gitignore

Git を用いたソースコードのバージョン管理で、管理の対象から外すファイルを指定するのに用います。

app/

プロジェクトでの Ruby コードをこのディレクトリに置きます。新規にプロジェクトを作成すると、main.rb というファイルが自動的に生成されます。

resources/

このディレクトリには、画像やサウンドファイルなどのプロジェクトで使用するリソースファイルを置きます。新規プロジェクトの作成直後は、ファイルはありません。

spec/

このディレクトリには、アプリケーションの spec やテストファイルを置きます。新規にプロジェクトを作成すると、デフォルトの spec ファイルが自動的に生成されます。

RubyMotion のプロジェクトは Rake をベースとしています。以降のセクションで、基本的な Rake タスクについて扱います。利用できるタスクの全リストを見たい場合には、以下のように Terminal で実行します。

$ rake -T
Tip Rake は Ruby での標準的なビルドシステムです。同様のものとして、Mac OS X では標準で make が付属しています。

2. Configuration

rake config タスクは、プロジェクトの設定をダンプします。各設定値には適切なデフォルト値が設定されており、Rakefile を編集することで設定を変更できます。

2.1. Common Options

Variable Discussion

name

プロジェクト名 (String)。motion create で指定した名前となります。

version

プロジェクトのバージョン (String)。デフォルト値は "1.0" です。

short_version

プロジェクトのショートバージョン (String)。 App Store にリリースするごとにユニークな値にする必要があります。デフォルト値は "1" です。

identifier

プロジェクト識別子 (String)。逆 DNS 形式で指定します。デフォルト値は "com.yourcompany."name 変数の値を結合した値です。

delegate_class

アプリケーションの delegate クラス名 (String)。デフォルト値は "AppDelegate" で、このクラスは app/main.rb で定義されています。

files

プロジェクトで使用するファイル (Array)。デフォルト値は Dir.glob(./app/*/.rb) を評価した結果となります (app ディレクトリ内のすべての .rb)。

frameworks

リンクする iOS フレームワークの名前 (Array)。/System/Library/Frameworks で示されるような、public な iOS フレームワークの名前を指定します。ビルドシステムは依存関係に対処できます。たとえば、"Foundation" を利用していれば "CoreFoundation" を指定する必要はありません。デフォルト値は ["UIKit", "Foundation", "CoreGraphics"] です。

weak_frameworks

frameworks と同様のものですが、deployment_target で指定したバージョンのデバイスで利用可能な場合にのみリンクされます。これは XCode の Optional 設定に関連しており、 deployment_target で使用できないフレームワークを使用するプロジェクトで役立ちます。 iOS Frameworks でフレームワークを確認できます。 デフォルト値は空の配列 [] です。

libs

リンクするライブラリのパス (Array)。システムライブラリの "/usr/lib/libz.dylib" のような、public なライブラリのパスを指定します。デフォルト値は空の配列 [] です。

build_dir

アプリをビルドする際に使用するディレクトリのパス (String)。プロジェクトディレクトリからの相対パスを指定します。指定されたディレクトリが存在しない場合には、ビルドシステムによって作成されます。もしディレクトリが作成できない場合、テンポラリディレクトリが代わりに使われます。デフォルト値は "build" です。

resources_dirs

リソースファイルを置くディレクトリのパス (Array)。デフォルト値は ["resources"] です。

specs_dir

spec ファイルを置くディレクトリのパス (String)。デフォルト値は "spec" です。

xcode_dir

Xcode がインストールされているディレクトリを指定します (String)。デフォルト値は /usr/bin/xcode-select -printPath が返す値によって決まり、もし正しい値でなければ /Applications/Xcode.app/Contents/Developer の値が使われます。この設定値を変更する場合には、他の設定を変更する前に行う必要があります。

sdk_version

使用する SDK のバージョン番号 (String)。デフォルト値は xcode_dir 内の最新 SDK のバージョン番号です (例 : "5.0")。

deployment_target

ターゲットとする SDK のバージョン番号 (String)。デフォルト値は sdk_version の値です。古いバージョンの iOS をターゲットするために値を下げることができます (例 : "4.3")。

codesign_certificate

CodeSign に使用する証明書の名前を指定します (String)。デフォルト値は keychain で最初に見つかる iPhone Developer 証明書です (例 : "iPhone Developer: Darth Vader (A3LKZY369Q)")。

Configuration の各項目でカスタマイズする値は、RakefileMotion::App.setup ブロックに追加します。

2.2. iOS Options

Variable Discussion

icons

アイコンに使用するリソースファイル名のリスト (Array)。例 : ["Icon.png", "Icon-72.png", "Icon@2x.png"]. アイコンファイルについては HIG guidelines を確認してください。デフォルト値は空の配列 [] です。

fonts

リソースディレクトリ内のフォントファイル名のリスト (Array)。例 : ["Inconsolata.otf"]. アプリケーションを生成する際に、フォントが適切に適用されます。デフォルト値は、リソースディレクトリ内のすべての .ttf.otf のリストです。デフォルト値を使うことを推奨します。

prerendered_icon

icons のアイコンファイルが、HIG guidelines に従ってあらかじめ描画されているかを指定します。false を指定すると、iOS がアイコンにリフレクション効果を適用します。デフォルト値は false です。

device_family

サポートするデバイスを指定。iphoneipad[:iphone, :ipad] (ユニバーサルアプリ) を指定できます。デフォルトの値は iphone です。

interface_orientations

サポートするデバイスのインタフェースの向きを指定します。値は Array で、次のシンボルを 1 つ以上含める必要があります。:portrait:landscape_left:landscape_right:portrait_upside_down のシンボルが利用できます。デフォルトの値は [:portrait, :landscape_left, :landscape_right] です。

provisioning_profile

deployment に使用するプロビジョニングプロファイルのパスを指定します (String)。デフォルト値は ~/Library/MobileDevice/Provisioning Profiles で最初に見つかる .mobileprovision ファイルです。

seed_id

アプリケーションのプロビジョニング識別子 (String)。iOSプロビジョニングポータル (iOS Provisioning Portal) によって生成された 10 文字の (App Store内で) ユニークな識別子です。デフォルト値は provisioning_profile で最初に見つかるアプリケーション識別子です。

2.3. OS X Options

Variable Discussion

icon

アプリケーションのアイコンとして使用するアイコンのリソースファイル名 (String)。 例 : "Icon.png" 。デフォルト値は空の文字列 '' です。

copyright

アプリケーションのプロパティファイルで使用される、誰でも読むことができる Copyright を指定します (String)。デフォルト値は "Copyright (c) CURRENT_DATE CURRENT_USER. All Right Reserved." です。

embedded_frameworks

アプリケーションバンドルに埋め込む 3rd-party frameworks のリストで、ファイルパス文字列の Array にしたものです。例 : ["../MyFramework/framework"] 。 デフォルトの値は空の配列です。

external_frameworks

/System/Library/Frameworks 以外の使用するフレームワークのリストで、アプリケーションには埋め込みません。ファイルパス文字列の Array にしたものです。例 : ["/Library/Frameworks/iTunesLibrary.framework"] 。 デフォルトの値は空の配列です。

codesign_for_development

development ビルドでコード署名をするか指定します。false の場合には、コード署名は行われません。デフォルト値は false です。

codesign_for_release

release ビルドでコード署名をするか指定します。false の場合には、コード署名は行われません。デフォルト値は true です。

2.4. Providing Custom Values

例として、iPad 用の架空のビデオプレーヤーの設定を取り上げましょう。サポートするデバイスは iPhone から iPad に変更します。オーディオ機能のために、AVFoundation フレームワークをアプリケーションに追加します。

Motion::Project::App.setup do |app|
  app.name = 'Awesome Video Player'
  app.device_family = :ipad
  app.frameworks += ['AVFoundation']
end

2.5. Files Dependencies

デフォルトでは、RubyMotion はファイルシステムによって決定されるソート順でファイルをコンパイルします。RubyMotion アプリケーションが起動したあとで、各ファイルのメインスコープは特定の順序で実行されます。

たとえば、あるファイルで使用する定数が他のファイルで定義しているという依存関係がある場合に、実行順序のカスタマイズが必要となるでしょう。

$ cat app/foo.rb
class Foo
end
$ cat app/bar.rb
class Bar < Foo
end

上記の例では、デフォルトの順序を用いると、foo.rb の前に bar.rb がコンパイルされ定数未定義エラーになります。これは bar.rb のコードを実行するときに Foo がまだ定義されていないからです。

この問題に対処するためには、Rakefilefiles_dependencies メソッドを使用します。このメソッドは、ファイルの依存関係を設定した Hash を受け付けます。

Motion::Project::App.setup do |app|
  # ...
  app.files_dependencies 'app/bar.rb' => 'app/foo.rb'
end

この変更の後は、ビルドシステムは bar.rb の前に foo.rb をコンパイルします。

2.6. Vendoring 3rd-Party Libraries

iOS と OS X SDK には非常に多くの機能が組み込まれていて、それらを RubyMotion から使用することができます。しかし、時にはシステムに不足している機能を提供するサードパーティライブラリを使用しなければならないかもしれません。

RubyMotion でサードパーティライブラリを利用するには、ソースコードがファイルシステム上の存在し利用可能でなければなりません。サードパーティライブラリは、プロジェクトのディレクトリ内 (たとえば、vendor ディレクトリの配下) に置くことをおすすめします。

Rakefilevendor_project メソッドを使用しサードパーティライブラリを設定します。第一引数にはサードパーティライブラリへのパスを必ず指定します (例 : "vendor/OAuth2Client")。第二引数にはサードパーティライブラリのプロジェクトの種類を示す symbol を必ず指定します (例 : :xcode)。そのほかの引数は key/value のリストとして指定できます。

以下は、プロジェクトの種類と key/value をまとめた表です。

Project Type Key Discussion

:xcode

:xcodeproj

使用する Xcode プロジェクトファイル名を指定します。ディレクトリに .xcodeproj が 1 つだけしかない場合には不要です。

:target

ビルドするターゲット名を指定します。省略すると、デフォルトのターゲットが使用されます。:scheme と一緒に使用することはできません。

:scheme

ビルドするスキーム名を指定します。省略すると、デフォルトのスキームが使用されます。:target と一緒に使用することはできません。

:configuration

ビルドするコンフィギュレーション名を指定します。省略すると "Release" が使用されます。

:headers_dir

RubyMotion プロジェクトで使用される API が宣言されている、パブリックなヘッダファイルが置かれているディレクトリへのパスを指定します。vendor_project の第一引数で与えられたパスとの相対パスを指定します (例 : "Sources/Headers")。この設定は省略可能です。

:products

RubyMotion プロジェクトで使用するライブラリ名を含んだ Array を指定します (例 : ["libfoo.a"])。プロジェクトが複数のライブラリをビルドし、アプリで使用するライブラリをフィルタしたいというケースで、このキーを用います。

:bridgesupport_cflags

BridgeSupport メタデータを生成する際に使用する CFLAGS を指定します。(例 : "-fobjc-arc" ARCをオンにする場合)。この設定は省略可能です。

:static

:products

使用する static ライブラリ名を含んだ Array を指定します。デフォルト値は vendor プロジェクトディレクトリのすべての .a をリストにした値です。

:source_files

コンパイル対象となる全てのソースファイルとヘッダファイルを含む Array を指定します。デフォルト値はvendorプロジェクト内の "*/.{c,m,cpp,cxx,mm,h}" にマッチする全てのファイルのリストです。

:cflags

コンパイルに使用する CFLAGS を指定します (例 : "-fobjc-arc" ARCをオンにする場合)。この設定は省略可能です。

:bridgesupport_cflags

BridgeSupport メタデータを生成する際に使用する CFLAGS を指定します。(例 : "-fobjc-arc" ARCをオンにする場合)。この設定は省略可能で、デフォルトは :cflags の値です。

さきほどの例を引き続き、サードパーティライブラリの OAuth2Client を使用するビデオプレーヤープロジェクトを仮定しましょう。vendor ディレクトリを作成し、OAuth2Client のソースコードをそこへ追加します。

$ cd AwesomeVideoPlayer
$ ls vendor
OAuth2Client

そして Rakefile を変更します。

Motion::Project::App.setup do |app|
  # ...
  app.vendor_project('vendor/OAuth2Client', :xcode,
      :target => 'OAuth2Client',
      :headers_dir => 'Sources/OAuth2Client')
  app.frameworks << 'Security' # OAuth2Client depends on Security.framework
end

2.6.1. Embedded Frameworks

Note OS X only.

OS X アプリケーションは 3rd-party frameworks をバンドルディレクトリ内に埋め込むことができます。上で記述した、vendor_project を利用したスタティックライブラリの組み込み方の代わりとして使用できます。

アプリに 3rd-party framework を埋め込む際には、Rakefileapp.embedded_frameworks を使用します。

Motion::Project::App.setup do |app|
  # ...
  app.embedded_frameworks << '../MyFramework.framework'
end

埋め込まれた frameworks はアプリケーションバンドルの Contents/Frameworks というディレクトリ内にコピーされます。アプリケーションのバイナリの実行ファイルは framework への相対パスを参照するように再構成されます。

2.7. Entitlements

Note iOS only.

エンタイトルメント (Entitlements) はアプリケーションに特定の機能やセキュリティ許可を与えます。システムの特定の機能にアクセスしようとすると、Apple によってエンタイトルメントのリクエストが必要とされるでしょう。

iOS デバイス上で動作するアプリケーションがそのような機能を使用するとき、エンタイトルメントがなければ動作時にエラーとなります。App Store へ登録することもできないでしょう。

エンタイトルメントはビルドの CodeSign 処理中に使用されます。

Rakefileentitlements メソッドの設定値は、デフォルトで空の Hash オブジェクトを返します。適切な keys/values により設定を変更できます。

たとえば、ビデオプレーヤーがユーザの証明書を保存するために keychain へのアクセスを必要とします。ドキュメントによると、keychain-access-groups エンタイトルメントのリクエストが必須で、アプリケーションのプロビジョニング識別子とアプリケーション識別子の組み合わせとなります。RubyMotion では seed_ididentifier です。

Motion::Project::App.setup do |app|
  # ...
  app.entitlements['keychain-access-groups'] = [
    app.seed_id + '.' + app.identifier
  ]
end

2.8. Advanced Info.plist Settings

iOS アプリはアプリケーション内にバンドルされた、Info.plist で設定を記述します。このファイルには key と value の組み合わせを記述します。それらについては Info.plist reference ガイドで詳細に説明されています。

RubyMotion プロジェクトでは、Info.plistRakefile で設定されたオブジェクトを元にします。たとえば、Info.plistCFBundleNameRakefilename を元にします。Configuration の各オブジェクトは、ほとんどプロジェクトで必要となる設定をします。

しかし、より高度なプロジェクトの設定が必要なケースがあるかもしれません。 Rakefile インタフェースはすべての可能な設定をカバーしていません。しかし、内部の Info.plist データ構造は、必要に応じて変更できます。

例として、ビデオプレーヤーをとりあげます。このアプリは、ブラウザからカスタムな URI をオープンできるようにするために、URI スキームの登録を必要とします (例 : x-videoplayer://play)。Rakefile の Configuration オブジェクトは、これをサポートしていません。

Reference ガイドは CFBundleURLTypes をキーとして使用しなければならないと説明しています。info_plist メソッドを用いてキーを設定できます。このメソッドは変更可能な Hash オブジェクトを返します。

Motion::Project::App.setup do |app|
  # ...
  app.info_plist['CFBundleURLTypes'] = [
    { 'CFBundleURLName' => 'com.mycompany.x-videoplayer',
      'CFBundleURLSchemes' => ['x-videoplayer'] }
  ]
end

3. Build

rake build タスクは、テンポラリーな build ディレクトリにプロジェクトをビルドします。 iOS プロジェクトでは、一つは (Mac 上で動作する) iOS シミュレータ向け、もう一つは iOS デバイス向けの 2 種類がビルドされます。OS X プロジェクトでは、1 種類のビルドが行われます。

以下は、ビルド処理中で行われる行程です。

  1. 各 Ruby のソースコードファイルは、Ruby の構文木から LLVM を用いて中間言語に、そしてアセンブリに変換し、最適化された機械語へコンパイルされます。iOS 向けに、コンパイラは Intel 32-bit (i386) または ARM (armv6, armv7) の命令語とターゲットに依存した ABI のコードを生成します。OS X 向けには、コンパイラーはIntel 32-bit (i386) と 64-bit (x86_64) の両方をターゲットとします。

  2. 実行可能なファイルを作成するために機械語と RubyMotion ランタイムが静的にリンクされます。リンカーはプロジェクトで使用する Configuration で指定されたサードパーティライブラリ や C API のメタデータも含めます。

  3. .app 形式のバンドルを作成し、そこへ実行ファイルをコピーします。プロジェクトの Configuration をベースとした Info.plist を作成します。resources ディレクトリの各リソースファイルをバンドル内にコピーします。プロジェクトから削除された古いリソースファイルは、アプリケーションのバンドルから取り除かれます。

  4. プロジェクトの Configuration で指定されたエンタイトルメント、プロビジョニングプロファイルと証明書に基づきバンドルを CodeSign します。

build タスクは他のタスクの依存関係により実行されるので、通常は明示的に build タスクを実行する必要はありません。

3.1. Xcode Resource Files

ビルドシステムは、次の resources ディレクトリ内の Xcode リソースファイルを検出し、適切にコンパイルし生成された .app バンドル内にコピーします。

Source Extension Compiled Extension Description

.xib

.nib

Interface Builder files.

.storyboard

.storyboardc

Storyboard files.

.xcdatamodeld

.momd

CoreData model files.

コンパイルされたファイルは rake clean によって削除できます。

3.2. Parallel Compilation

Ruby ソースファイルの機械語へのコンパイルは、多くの時間がかかります。

プロジェクトをビルドするのに使用する Mac がマルチコアプロセッサであれば、コンパイル処理を並列分散することができます。非常に多くのファイルを含んだプロジェクトをビルドする場合に、これは非常に役に立つでしょう。

ビルドシステムは、コンパイル処理をどれだけ並列して行えるか決定するために sysctl の machdep.cpu.thread_count の値を使用します。たとえば、Intel Core i7 プロセッサで動作する MacBook Pro は 4 つのコアを持っています。それぞれのコアは 2 つのスレッドを平行実行できるので、ビルドシステムは最大 8 つのファイルを同時にコンパイルします。

環境変数 jobs の値を設定することで、ビルドシステムが並列処理する数を変更することができます。たとえば、ビルドシステムによって処理が中断されては困る処理を実行している場合には、より低い値を設定します。

$ rake jobs=1        # Force compilation tasks to be sequential.

3.3. Cleaning

rake clean タスクは build ディレクトリを空にし、ベンダープロジェクトの build ディレクトリをクリーンします。

$ rake clean

4. Running

デフォルトの rake タスクはプロジェクトをビルドし、アプリを手元の Mac 上で実行します。

$ rake

iOS プロジェクトでは、アプリケーションが iOS シミュレータ上で実行されます。デフォルトの rake タスクは rake simulator のショートカットとなっています。

OS X プロジェクトでは、アプリケーションは直接 Mac 上で実行されます。デフォルトの rake タスクは rake run のショートカットとなっています。

4.1. Passing Arguments

開発している際に、アプリケーション起動時にコマンドライン引数を渡したいというケースがあるかもしれません。

rake タスクは環境変数 args の値を引数として与えることができます。例えば、次のように CoreData SQL をデバッグすることができます。

$ rake args="-com.apple.CoreData.SQLDebug 1"

4.2. Interactive Console

アプリを実行するときに、Ruby の irb と類似した、interactive shell が利用できます。

interactive shell で式を評価できます。interactive shell は実行中のアプリをブロックしません。入力された式は、アプリを実行するメインスレッドに送られます。

Note REPL (read-eval-print-loop) のサポートはアプリの必要に応じて、共有ライブラリを通じてロードされます。デフォルトでは、シミュレータ向けにビルドされたアプリは、iOS デバイス向けにビルドされたアプリよりもコードが含まれません。

help を実行すると、ビルトインの式について情報を得ることができます。

interactive shell にはアプリ上で、view を選択する機能もあります。command キーを押しながらマウスをアプリのウィンドウ上を移動します。view の周りには赤い枠が表示され、interactive shell 上に選択されているオブジェクトが表示されます。クリックすると、interactive shell は選択した view のコンテキスト (self オブジェクト) で新しい session を開きます。

4.3. Universal Applications

Note iOS-only.

ユニバーサルアプリケーションは iPhone と iPad デバイスの両方をターゲットとします (詳細はプロジェクトの Configuration の device_family 設定を確認してください)。

このようなケースでは、シミュレータで使用するデバイスの種類を指定できると便利です。シミュレータにはプロジェクトの Configuration 設定で最初に指定されたデバイスを使用します。

デフォルトで起動するシミュレータの種類を、環境変数 device_familyiphoneipad を指定し変更できます。たとえば、ユニバーサルアプリを iPad シミュレータで起動するには以下のように実行します。

$ rake simulator device_family=ipad

4.4. Retina Mode

Note iOS-only.

環境変数 retinatrue と設定することにより、シミュレータを Retina モードで起動することができます。

$ rake simulator retina=true

4.5. Cleaning the Sandbox

Note iOS-only.

各アプリケーションは、iOS シミュレータのサンドボックス内のディレクトリにあります。このディレクトリはアプリケーションバンドルや、DocumentsLibrary フォルダを含み、ファイルシステムの状態を保持します。シミュレータ上でアプリケーションを実行する際に、サンドボックスがなければ作成され、あるいは既存のサンドボックスにアプリケーションがコピーされます。

シミュレータを実行する前に、アプリケーションのサンドボックスをきれいにしたいと望むかもれません。たとえば、プロジェクトからリソースファイルが削除された場合や、アプリケーションの状態のデータをクリーンアップする必要があるときなどがあげられます。

サンドボックスのクリーンアップは、環境変数 clean に何か値を設定すると、シミュレータを実行する前に、アプリケーションのサンドボックスを掃除します。

$ rake simulator clean=1

5. Testing

RubyMotion は、アプリケーションの spec を取り扱う、ビルトインの Behavior-Driven Development 機能を持っています。RubyMotion はシステムと統合するために若干修正した Bacon フレームワークを使用します。

spec ファイルは、spec ディレクトリに置かれます。

rake spec タスクはプロジェクトを spec 用に特別なバージョンでビルドし、アプリケーションの起動後に spec ファイルが実行されます。そして、Terminal の標準出力に spec の概要が出力され、アプリケーションが終了します。

Note: rake spec は、現在シミュレータ上でのみ動作します。

spec ファイルは、アプリケーションのクラスと同様に iOS と OS X SDK にフルアクセスできます。例として、以下のテストはアプリケーションが 1 つのアクティブウィンドウを持つかというものです。

$ cat spec/main_spec.rb
describe "My Awesome App" do
  it "has a window" do
    app = UIApplication.sharedApplication
    app.windows.size.should == 1
  end
end

アプリケーションが spec に従って正しく実装された場合には、rake spec はエラーの数が 0 という状態で終了します。

$ rake spec
...
My Awesome App
  - has a window

1 specifications (1 requirements), 0 failures, 0 errors

6. Archiving

RubyMotion プロジェクトは、App Store へアプリを提出し配信するためにアーカイブすることができます。

6.1. Development vs Release

RubyMotion プロジェクトは、開発向けあるいはリリース向けにビルドできます。シミュレータ上での実行や開発用の iOS デバイスで実行するために、開発向けにビルドされます。App Store へ提出するためにアーカイブを作成する際にはリリース向けにプロジェクトはビルドされます。

現在、RubyMotion アプリの開発向けとリリース向けのビルドは、実行可能なファイルからすべてのシンボルが取り除かれるかとういう違いだけです。この処理によって、アプリケーションバンドルから、およそ 1 MB のデータを取り除きます。しかしこれはデバッグを困難に、開発には適しません。

OS X プロジェクトでは、アプリはリリース向けに 32/64-bit のバイナリを含むようにビルドされます。開発向けのビルドでは、ビルド時間の短縮のために、ネイティブな CPU アーキテクチャのみがビルドされます。

プロジェクトをリリース向けにビルドする場合に、Rakefile で異なる設定を行うこともできます。

Motion::Project::App.setup do |app|
  # ...
  app.development do
    # This entitlement is required during development but must not be used for release.
    app.entitlements['get-task-allow'] = true
  end
end

6.2. Install on Device

Note iOS-only.

rake device は iOS デバイス向けに開発用のアーカイブをビルドしアップロードします。

1 つの iOS デバイスが Mac と USB 接続していなければいけません。 この処理では、USB 接続されている最初に見つかった iOS デバイスにアプリケーションがアップロードします。

以下のようなケースで処理が失敗するでしょう:

  • iOS デバイスが USB 接続されていない。

  • プロジェクトが、デバイス上で実行している iOS のバージョンよりも新しいバージョンでビルドされている。

  • プロジェクトの証明書やデバイスとリンクされているプロビジョニングプロファイルに不適切なものを使用している。

  • デバイスと通信する際に、USB の接続に問題がある。to the device.

処理が成功すると、アプリケーションはデバイスの SpringBoard 上で利用できます。

6.3. Distribution

rake archive タスクは開発向け・リリース向けの両方でアーカイブを生成するのに利用できます。アーカイブは ad-hoc な配信や App Store への提出に適しています。

iOS プロジェクト上では、アーカイブファイルは .ipa という拡張子になります。OS X プロジェクト上では、.pkg という拡張子になります。

App Store 用にアーカイブを作る際には、rake archive:distribution コマンドを使用します。

このタスクは、アプリケーションバンドルを CodeSign するために適切な証明書とプロビジョニングプロファイルが必要となります。

6.3.1. Manifest File

iOS プロジェクトは rake archive 実行時に manifest.plist を生成することができます。このファイルは over-the-air ad-hoc distribution を実装するために利用できます。

このファイルの生成を有効にするには、app.manifest_assets を用います。デフォルト値は空の配列で、アセットを記述した Hash オブジェクトを少なくとも 1 つ含める必要があります。 それぞれの Hash では kindurl をキーとして値を与えます。kind キーの値として、"software-package", "display-image""full-size-image" が利用できます。

次のコード片は 2 つのマニフェストアセットを記述したもので、アプリケーションのアーカイブの配布先とアプリケーションのアイコン画像の配布先を示します。

Motion::Project::App.setup do |app|
  # ...
  app.manifest_assets << { :kind => 'software-package',
                           :url => 'http://mycompany.com/files/myapp.ipa' }
  app.manifest_assets << { :kind => 'display-image',
                           :url => 'http://mycompany.com/files/myapp.jpg' }
end

このドキュメントの執筆時点では、Apple が適切なプロパティリストを公開していないため、ネットを検索する必要があるかもしれません。