MakeTiの使い方

# MakeTiとは？

MakeTiとは、コマンドラインからTitaniumプロジェクトのビルド・実行及び実機への転送を行うことができるツールです。
私は普段Emacsでコードを書いているので、Titanium Studioを立ちあげなくてもEmacs上からコマンドラインを使ってビルド〜実機インストールまで行えるこのツールを利用しています。

既にTitanium CLIやAlloyといったツール/フレームワークでもコマンドラインから実行できるようになっていますが、iPhoneアプリの実機転送についてはまだサポートされていないようだったのと、最近チェックしてみたらいつの間にかAd Hocビルドに対応していたりしていたので、まだまだMakeTiの需要はあるかもということで、改めて使い方を整理してみました。

* 2013/1/10時点の情報です。
* Titanium Studio/SDKを使ったiPhoneアプリ/Androidアプリの開発環境（実機転送ができる状況）は整っている前提です。
* 私の現在の環境がMacのため、Macでの使い方になっています。

## MakeTiできる主なこと

* iOSシミュレータ/Androidエミュレータでの実行
* iOS/Android実機への転送
* iOSアプリのAd Hocビルド
* TestFlight/HockeyKitを利用した配布

※今後の予定として、App Store/Google Playへのデプロイも計画されているようなので、期待しています。


# チートシート

詳しい準備やコマンドの説明は後述するとし、主要な使い方を羅列しておきます。

|コマンド|内容|
|:-------|:---|
|$ make clean|中間ファイルを削除する|
|$ make run|iPhoneシミュレータで実行する|
|$ make run iphone=6.0|iOSバージョンを指定してiPhoneシミュレータで実行する|
|$ make run platform=ipad|iPadシミュレータで実行する|
|$ make deploy [action=install] cert=1 profile_file=development|1番の証明書とdevelopment.mobileprovisionを使って、iPhone/iPadアプリをiTunes経由で転送する|
|$ make deploy action=adhoc cert=2 profile_file=adhoc|2番の証明書とadhoc.mobileprovisionを使って、iPhone/iPadアプリのAd Hoc配布用ビルドを行う|
|$ make deploy [action=install] cert=1 profile_file=development testflight=true notes="release notes"|iPhone/iPadアプリをTestFlightを使って配布する|
|$ make clean && make run platform=android|起動しているAndroidエミュレータで実行する|
|$ make clean && make deploy platform=android|Androidの実機へ転送する|
|$ make clean && make deploy platform=android apkonly=true|AndroidアプリのAPK生成のみを行う|



# 事前準備

## MakeTi

### MakeTiを入手する

まずは、GitHubからMakeTiプロジェクト一式を入手します。

[appersonlabs/MakeTi](https://github.com/appersonlabs/MakeTi)

### MakeTiをプロジェクトで使う準備をする

MakeTiプロジェクトには、最近話題の[恋に落ちるエディタ](http://www.sublimetext.com/)用のプラグインなども含まれていますが、単純にコマンドラインから利用する場合は、それらのうち以下のファイルを利用します。

* Makefile
* bin/titanium.sh

上記2ファイルを、Titaniumプロジェクトのルートディレクトリ直下にコピーします。

## iOS用の準備

### プロビジョニングプロファイルを用意する

プロジェクト直下に`certs`ディレクトリを作成して、必要なプロビジョニングプロファイルを配置します。
実機に転送する場合は、最低でも開発用プロビジョニングプロファイルが必要です。

### 一度iPhoneシミュレータを起動しておく

Xcode/iPhoneシミュレータを一度も起動したことがない状態（またはXcodeをアップデートした直後など）で実行すると、iPhoneシミュレータが起動しない（起動してもすぐに終了してしまう）場合があるようでした。
事前にサンプルプロジェクトなどを使ってビルド/実行をしておくと良いかもしれません。

## Android用の準備

### Android SDKの設定を行う

Makefile内の`ANDROID_SDK_PATH`を自分の環境に合わせて変更します。
私の場合、Android SDKを`~/Library/android-sdk-macosx`に置いているため、以下のように変更しています。

```make:Makefile
    # This is the ONLY option you should / need to configure
    ANDROID_SDK_PATH='~/Library/android-sdk-macosx'
```

#### ANDROID_SDK_PATHの注意点

上記の設定方法が本来意図しているものだと思うのですが、現状のMakeTiではMakefileとtitanium.sh両方に上記変数が記述されているため、実際にはMakefileだけを修正しても正常に動きません。
（titanium.sh内で上書きされているため）

そこで私は、titanium.sh内の記述を削除して、Makefileの変数を使用するように修正したものを使っています。
（titanium.sh内のANDROID_SDK_PATHを直接修正しても良いと思います）

```titanium.sh
    # Android settings
    if [ "${android}" == "" ]; then
    	android="titanium_2_WVGA854"
    fi
    TI_ANDROID_DIR="${TI_ASSETS_DIR}/android"
    TI_ANDROID_BUILD="${TI_ANDROID_DIR}/builder.py"
    ANDROID_SDK_PATH='~/Android'    # ←この行を削除
```

```make:Makefile
deploy:
	@if [ "${DEVICE_TYPE}" == "" ]; then\
		echo "No platform selected... building for iphone.";\
	fi

	@echo "Building with Titanium... as ${BUILD_TYPE}"
	@mkdir -p '${PROJECT_ROOT}/${PROJECT_NAME}/build/iphone/'
	@mkdir -p '${PROJECT_ROOT}/${PROJECT_NAME}/build/android/'
	PROJECT_ROOT='${PROJECT_ROOT}' DEVICE_TYPE=${DEVICE_TYPE} BUILD_TYPE='device' ANDROID_SDK_PATH='${ANDROID_SDK_PATH}' bash '${MAKETI_DIR}/bin/titanium.sh'
	# ↑に ANDROID_SDK_PATH='${ANDROID_SDK_PATH}' を追加
```

参考までに、上記2ファイルを修正したものをGitHubに載っけてみました。
[umi-uyura/MakeTi](https://github.com/umi-uyura/MakeTi)



# 使い方

## プラットフォーム共通

### 中間ファイルを削除する

    $ make clean

ビルド時に生成した中間ファイルと呼ばれるものを削除します。
Android/iPhoneやiPhone/iPadなど、複数のプラットフォームを対象に開発する場合に、ビルド/実行するプラットフォームを変更する際には一度cleanを行うと良いようです。
特にAndroidの場合はビルドの度にcleanすることが推奨されているようで、以下のように連結して使うと良いようです。

例）

    $ make clean && make <run|deploy> platform=android ...

## iPhone/iPad

### iPhoneシミュレータで実行する

    $ make run [iphone=<version>] [platform=<platform name>]

|オプション|説明|
|:---------|:---|
|iphone|実行するiOSのバージョンを指定します。省略した場合、`iphone=6.0`になります。（例：iOS 4.3の場合、`iphone=4.3`）|
|platform|実行するプラットフォームを指定します。(iphone/ipad/android、デフォルトはiphone) （例：iPadの場合、`platform=ipad`）|

デフォルトのiOSバージョンを変更したい場合は、titanium.sh内の`# iPhone settings`というコメント辺りにある`iphone="6.0"`の箇所することでできます。


### iTunes経由で転送する

    $ make deploy [action=install] cert=<number> [profile_file=<provisioning profile>]

|オプション|説明|
|:---------|:---|
|action|デプロイ方式を指定します。（install/adhoc）省略した場合、`install`となります。|
|cert|使用する開発者証明書を示す番号を指定します。（例：1番の場合、`cert=1`）|
|profile_file|開発用のプロビジョニングファイルのファイル名を指定します。その際、".mobileprobision"は不要です。省略した場合、`development`を使います。（例："development.mobileprovision"の場合、`profile_file=development`）

証明書を指定する番号は、
`$ make deploy`
と実行すると表示される

    *****************************************************************************************************************
    Please re-run the build command using a 'cert' flag, with the value set to the index of one of the certs below...
    [0] xxxxxxxxxxxxxx (##########)
    [1] xxxxxxxxxxxxxx (##########)
    [2] xxxxxxxxxxxxxx (##########)
    *****************************************************************************************************************

の左端に表示されている番号（`[0]`など）を指定します。


### Ad Hoc配布用のビルドを行う

    $ make deploy action=adhoc cert=<number> profile_file=<provisioning profile>

|オプション|説明|
|:---------|:---|
|cert|使用する配布用証明書を示す番号を指定します。（例：2番の場合、`cert=2`）|
|profile_file|Ad Hoc配布用のプロビジョニングファイルのファイル名を指定します。その際、".mobileprobision"は不要です。省略した場合、`development`を使います。（例："adhoc_distribution.mobileprovision"の場合、`profile_file=adhoc_distribution`）

実行すると、`<project root>/CinemaEstate/build/iphone/build/Release-iphoneos/<app name>.ipa`にIPAが生成されています。

証明書を指定する番号は、
`$ make deploy action=adhoc`
と実行すると確認できます。


## Android

### Androidエミュレータで実行する

    $ make clean && make run platform=android [android=<emulator>]

|オプション|説明|
|:---------|:---|
|android|実行するエミュレータ名（※1）。省略した場合、`titanium_2_WVGA854`を使います（※2）。（例："titanium_8_WVGA854"の場合、`android=titanium_8_WVGA854`）|

※1 Makefileのhelpには"Android API level"と記載されているのですが、実際にはAPIレベルはtiapp.xml内の`<tool-api-level>`が使われます。（存在しない場合は、APIレベル8と見なされます）

※2 が、実行しているエミュレータが1台であれば、自動的にそのエミュレータを使ってくれるようです。また私の環境では、androidオプション（エミュレータ名）を指定しても、複数エミュレータが起動していると、`error: more than one emulator`というエラーと共にビルドが止まってしまいましたので、まだ未完成のようです。

#### 事前にエミュレータを起動しておく

なお、エミュレータ実行する前に、実行環境となるAndroidエミュレータを起動しておく必要があります。
自分の環境にあるAndroidエミュレータ(AVD)は、
`$ android list avd`
で調べることができ、
`$ emulator -avd <avd name>`
で実行することができます。

### 実機へ転送する

    $ make clean && make deploy platform=android

### APKの生成のみを行う

    $ make clean && make deploy platform=android apkonly=true

実行すると、`<project root>/build/android/bin/app.apk`にAPKが生成されています。


## Mobile Web

公式には記載されていませんが、プラットフォーム指定でMobile Webも対応していました。
現状は、必要なHTML/CSS/JSなどをビルドするに留まり、出力されたものをWebサーバーなどにコピーして使う感じのようです。

### ビルドする

    $ make clean && make run platform=web

実行すると、`<project root>/build/mobileweb/`に必要なファイル一式が出力されます。



# その他、便利な使い方

## TestFlightを使って配布する

MakeTiは、開発中のiPhoneアプリをOTA配信するサービスの[TestFlight](https://testflightapp.com)にも対応しており、ビルドと合わせてTestFlightへアップロードすることができます。

### 事前準備

TestFlightのサイトの以下のURLから、API TokenとTeam Tokenを入手します。

**Account Settings**内の**API Token**
https://www.testflightapp.com/account/#api

**Team Info**内の**Team Token**
https://www.testflightapp.com/dashboard/team/edit/


また、アップロードと同時に通知メールを配信するには、予め配信対象者のDistribution Listを作成しておく必要があるようです。
以下のURLの右側にある**"+ Add Distribution List"**ボタンから、配信するメンバーを集めたリストを作成してください。
https://www.testflightapp.com/dashboard/team/

次に、プロジェクト直下のtiapp.xmlに各情報を設定します。
アップロード通知を行わない場合は、`<tf_dist>`は不要です。
また、カンマ区切りで複数のリストを指定することもできるようです。

```tiapp.xml
    <ti:app>
        ...
        <tf_api><!-- API Tokenを記載 --></tf_api>
        <tf_token><!-- Team Tokenを記載 --></tf_token>
        <tf_dist><!-- Distribution List Nameを記載 --></tf_dist>
    </ti:app>
```

#### TestFlightへアップロードする

    $ make deploy [action=install] cert=<number> [profile_file=<provisioning profile>] testflight=true [notes=<release notes>]

基本的にはiPhone/iPadの**iTunes経由で転送する**と同じで、TestFlightへアップロードを指定するパラメータを追加します。

|オプション|説明|
|:---------|:---|
|testflight=true|TestFlightへアップロードする指定です。|
|notes|Build InfomationのRelease Notesに記載する内容です。省略した場合、MakeTiが`"Build uploaded automatically from MakeTi."`というコメントを付けてくれます。|


## HockeyKitを使って配布する

どなたか事例がありましたら・・・


# 参考情報

大変参考にさせて頂きました。

* [appersonlabs/MakeTi](https://github.com/appersonlabs/MakeTi)
* [MakeTiをAndroidで利用する](http://twingo-b.github.com/blog/2012/11/04/maketi/)
* [makeTiでTestFlightにIPAファイルをアップロードする方法](http://www.masaplabs.com/maketi-uploadtestflight/)