製品版と開発版で設定を分離できるTitanium CLIプラグイン「dev.tiapp」

以前 [Ti Weekly Clips](http://ti-news.hatenablog.jp/entry/2014/08/30/085952) にて紹介されていたプラグインですが、使ってみて便利だったので、改めて紹介させてください。

なお、本記事はdev.tiappの0.0.3をベースに書いています。

導入
----

[yomybaby/dev.tiapp](https://github.com/yomybaby/dev.tiapp/)

npmでインストールできます。

```
$ [sudo] npm install -g dev.tiapp --unsafe-perm
```

`sudo` は必要に応じてつけてください。


どんなプラグインなのか
----------------------

大きく2点あります。

* tiapp.xmlに、アプリ内で使用する設定を記述することができる
* tiapp.xmlに複数の設定を用意して、ビルドに応じて切り替えることができる


例えば、開発中のものと製品版では参照するサーバーが違うというケースは多々あると思います。

そういった場合、何かしらのフラグを用意して条件分岐するのがひとつの方法です。

Titaniumの場合、 [Conditional Code](http://docs.appcelerator.com/titanium/3.0/#!/guide/Alloy_Controllers-section-34636384_AlloyControllers-ConditionalCode) に記載されている `ENV_DEV` や `ENV_PRODUCTION` といった定数が用意されていますので、それを使って以下の様な条件を書いたりします。

```javascript
var server_url = "";
if (ENV_DEV) {
  // 開発中の参照先
  server_url = "http://192.168.33.10:8080/app";
} else {
  // 上記以外のビルドでの処理
  server_url = "http://www.example.com/app";
}
```

ただこういった開発時にしか使わないような情報は、本来製品版のコードには不要なものです。

そこでdev.tiappプラグインを使うと、その値をコードの中ではなく、このようにtiapp.xmlに設定できるようになります。

```tiapp.xml
<?xml version="1.0" encoding="UTF-8"?>
<ti:app xmlns:ti="http://ti.appcelerator.org">
  ...
  <property name="server_url">http://www.example.com/app</property>
  <property name="dev.server_url">http://192.168.33.10:8080/app</property>
  ...
</ti:app>
```

また設定した値は `Titanium.App.Properties` に保持されているので、例えば上記の設定の場合、以下のコードだけで、ビルド環境に対応した値が取得できます。

```javascript
var server_url = Titanium.App.Properties.getString('server_url');
```

上記の `server_url` は、シミュレータやエミュレータでビルドした場合は `http://192.168.33.10:8080/app` が、それ以外の場合は `http://www.example.com/app` が入ってきます。


基本的な使い方
--------------

基本的な使い方としては、developmentビルドか、それ以外かで設定を切り替えるというものです。

これだけの使い方であれば、プラグインが導入されていれば、特にビルド時に意識することなく自動的に切り替えを行ってくれます。


### \<property\>タグによる設定

アプリ内部で使用する値を切り替えたい場合は、 `<property>` タグとして用意して、 `dev.` という接頭辞をつけるだけです。

```xml
  <property name="server_url">http://www.example.com/app</property>
  <property name="dev.server_url">http://192.168.33.10:8080/app</property>
```

これらの値は `Ti.App.Properties.getString('server_url')` で取得でき、ビルド時の `deploy-type` が `development` の場合、 `dev.` がついた値を参照します。

### tiapp.xml自体の設定

Alloyベースで開発をしている場合、先に述べたようなアプリ内部で使用する値の設定については、app/config.jsonを使うことで解決できます。

ただ、このプラグインの特徴として、 例えば `<id>` や `<version>` など、アプリパッケージに関係する情報も切り替えることができる点があります。

例えば、

```xml
  <id>com.example.app.production</id>
  <dev.id>com.example.app.development</dev.id>
```

のようにすることで、developmentと、それ以外でアプリのIDを変更することができます。

また、

```
  <icon>appicon.png</icon>
  <dev.icon>appicon_dev.png</dev.icon>
```

とすることで、開発版と製品版でアイコンを分ける、といったこともできます。


カスタムPrefix
--------------

さらに細かい切り替えをするために、カスタムPrefixという機能があります。

要するに、上記の `dev.` という接頭辞を自由に設定できる、というものです。

例えば、より細かく「development」「adhoc」「production」と設定を分離したい場合、以下のようにtiapp.xmlに設定することができます。

```tiapp.xml
  <property name="server_url">http://www.example.com/app</property>
  <property name="dev.server_url">http://192.168.33.10:8080/app</property>
  <property name="adhoc.server_url">http://staging.example.com/app</property>
```

カスタムPrefixを使う場合は、ビルドする際にPrefixを指定する `--dev.tiapp` オプションを渡します。

```
$ titanium build -p ios --dev.tiapp adhoc
```

上記の例では、 `<property name="adhoc.server_url">` の値を使用します。


ローカルIP参照
--------------

APIサーバーと通信するアプリなどを開発する際に、ローカルにサーバーを立てて開発する場合もあると思います。

その場合は、 **\_\_LOCAL\_IP\__** という定数を使うと、自分のマシンのIPアドレスに書き換えてくれます。

DHCPだったり、複数人でそれぞれのマシンでサーバーを立てて開発をしている場合などに、固定のIPを設定しなくても良くなります。

```tiapp.xml
  <property name="dev.server_url">http://__LOCAL_IP__:8080</property>
```

ネットワークインターフェイスが複数ある場合などは、 `~/.dev.tiapp.json` というファイルを用意して、以下の様な設定をすることで、IPアドレスを取得するNICを指定することができるようです。

```.dev.tiapp.json
{
    "networkInterface": "en0"
}
```

活用例：ハイフンを含んだApp IDを使うとき（dev.tiapp版）
-------------------------------------------------------

以前、Qiitaに [iPhone/Android両対応アプリを作る際にハイフンを含んだApp IDを使うとき](http://qiita.com/umi_uyura/items/c6269861870b5d2ec9d5) というエントリを書きました。

このときはひとつの解法として、ビルドするプラットフォームに応じてtiapp.xmlを書き換えるという方法を使いましたが、dev.tiappを使うことで、都度ファイルの書き換えをさせることなく同様のことが実現できるようになります。

例えばiOSを主軸とした場合、

```tiapp.xml
  <id>com.example-japan.appid</id>
  <android.id>com.example-japan.appid</android.id>
```

のようなtiapp.xmlを用意しておき、切り替えは以下のように行ないます。

```
$ titanium build -p ios                               # 基本はiOS
$ titanium build -p android --dev.tiapp android       # Androidにするときはdev.tiappを利用し、<android.id>を使う
```


余談ですが、SDK 3.2だったか3.3あたりから、iOSとAndroid両方をターゲットしていて、かつハイフンまたはアンダースコアを含んだApp Idのプロジェクトを作れなくなっています。よって、もしそういったプロジェクトを作る場合は、まずはハイフンがないApp Idでプロジェクトを作成し、その後dev.tiapp用の設定と合わせてtiapp.xmlを書き換える、など一手間必要になっています。


参考
----

* [yomybaby/dev.tiapp](https://github.com/yomybaby/dev.tiapp/)
* [Ti Weekly Clips (2014/08/24～2014/08/30) #TitaniumJP - Titanium News](http://ti-news.hatenablog.jp/entry/2014/08/30/085952)
* [Titanium - iPhone/Android両対応アプリを作る際にハイフンを含んだApp IDを使うとき - Qiita](http://qiita.com/umi_uyura/items/c6269861870b5d2ec9d5)