シングルコンテキストでTi.UI.currentWindowやTi.UI.currentTabがundefinedになるのを回避する方法

Titaniumはシングルコンテキストで書くのが最近の流儀のようですが、
その場合Ti.UI.currentWindowにアクセスしようとしたら以下のようなエラーが出てしまいました。

[ERROR] Script Error = Result of expression 'Ti.UI.currentWindow' [undefined] is not an object. (unknown file).


そこで、focusイベントを利用して今選択中のウインドウが取得出来るようにしました。


app.js グローバル変数を定義

var ActiveWinTab = {};


AppWindow.js グローバル変数にwindowオブジェクトを紐付ける

self.addEventListener('focus', function(e){
    ActiveWinTab.activeWindow = self;
});


SecondView.js windowを閉じる

ActiveWinTab.activeWindow.close();


これで回避出来ました。



同様にTi.UI.currentTabもundefinedになって取得出来なかったので、こちらもグルーバル変数にTabGroupを紐付けるようにしました。
app.js

ActiveWinTab.tabs = require('ui/AppTabGroup').AppTabGroup();


FirstView.js TabGroup.activeTabを利用して現在のタブを取得

ActiveWinTab.tabs.activeTab.open(win);


これで無事undefined問題を回避出来ました!
Web上でも同じ問題が出た人が何人かいましたが、これはバグなのか仕様なのかどちらでしょうか・・・
※上記の回避方法はappceleratorのQ&Aで見たのですが、今探してもどこに書いてあったか見つけられませんでした


他にも回避方法やそもそも問題が起きない実装方法があるのかもしれません。
ご存知の方がいれば教えて下さい!

サンプルソースこちら

TitaniumでiPhoneへの実機転送時にはまった件のまとめ

iPhoneアプリをTitaniumで作ろうと思い、期限が切れていたiOS Developer Programを更新しました。
アプリを実機に転送して動作確認するために、プロビジョニングプロファイルを作成する必要が
あるのですが、うっかり以前作成した際に使った秘密鍵のバックアップ取らずにPCを新調して
しまっていました。

Xcodeで転送するまで

最初に作った秘密鍵がインストールされていないPCでアプリを実機に転送しようとすると以下の
ようなエラーが出てうまくいきません。

xcode could not find a valid private-key certificate pair for this profile in your keychain

そのため以下のサイトを参考に証明書の作り直しをしました。


が、まだエラーが・・・


あまり手順を把握していない状態でいろいろいじってしまったので、一度整理しようと思い
以下のAppleのサイトを参考にキーチェーンから不要な証明書を削除したり、Xcode
オーガナイザに登録されていた古いプロビジョニングプロファイルを削除するなどして綺麗な
状態にしました。


一度綺麗な状態にしてから最初に書いたURLの手順でプロビジョニングプロファイルを作成したところ、
無事Xcodeからの実機転送は出来ました。

Titaniumからの転送

ただ、まだTitanium Studio(1.0.7)から実機への転送が出来ません。
具体的にはTitaniumのプロジェクトで右クリックし「Install to iOS Device」を選択した際に
表示されるウインドウで、プロビジョニングプロファイルを「Upload」しても無反応で「Finish」の
ボタンがグレーのままでクリック出来ない状態でした。


調べたところ、Titanium BBSで同じ現象にはまってる人がいました。


どうもプロビジョニングプロファイルを置いているパスに日本語が入っているとダメなようで、
自分の場合はプロビジョニングプロファイルを置いているフォルダ名が日本語になっていました... orz

UnicodeDecodeError

フォルダを英語に修正して、ようやく「Finish」ボタンが押せる状態になりました。
これでやっと実機転送出来る!と思ったのもつかの間、今度はビルド時のコンソールで
以下のようなエラーが。。。

UnicodeDecodeError: 'utf8' codec can't decode byte 0x92 in position 0: invalid start byte

このへんで既に深夜3時くらいになっていたので心が折れそうでしたがこれもTitanium BBSで
同じ現象にはまってる人がいました。


うーん、どうやらプロビジョニングプロファイルを作るために必要な証明書に日本語が含まれているのが
原因のようです。

神サポート

確かに、以前からDeveloper Centerの「Personal Profile」の一部が日本語になって文字化けした
状態になってました。
最初の登録時にも日本語になってしまい、サポートに問い合わせして直してもらったのですが、
Apple IDと連動しているせいか何かのタイミングで更新してしまったようです。

しかもこの項目はDeveloper Centerからは変更出来ないため、仕方なくサポートに
問い合わせしてみることにしました。

このページの「Managing Your Account」のフォームに
例えば「山田 太郎」を英語で具体的に「Tarou Yamada」のように直してほしいと具体的に
指定したところ、翌朝には「日本語で書かれた内容が落ちててよくわからないけど、多分名前を変更して
欲しいだよね?修正しといたよ!違ってたら問い合わせ内容をPDFか画象にして送ってね」
といった旨のメールが返ってきました。


問い合わせの際に「Your Region」で「Japan」を選択していたので日本語で問い合わせを
送ったのですが、どうやら日本語で書いた部分が化けていたようです。


おそらくよくある問い合わせだったのと具体的に修正箇所を記述していたので気をきかせて
対応してくれたのだと思います。


早速証明書を新たに作るところからやり直してみると、無事転送成功!
(∩´∀`)∩ワーイ


Appleのサポートは年末なので対応に時間かかるだろうと覚悟してたのですが、早くて助かりました。


iPhoneへの実機転送は手順がやや複雑な事、秘密鍵を紛失した事、上記のようなTitaniumでの
日本語まわりの問題などが重なってかなり時間を使ってしまいました(´・ω・`)


ただ今回記事にまとめたことで今後は同様の事は繰り返さないと思います!
これで落ち着いて年が越せます・・・


良いお年を(^_^)/~

TitaniumのAndroid用モジュールを作る カスタムViewモジュールの作成

今回はTitaniumのモジュール機能を利用してカスタムViewを作ります。
最低限必要な手順を整理したかったので、カスタマイズ内容は通常のViewクラスに色をつけるだけのシンプルな内容にしました。

プロジェクトの作成

TitaniumのAndroid用モジュールを作る その1の手順に従って、モジュールのテンプレートプロジェクトを作成します。

titanium create --platform=android --type=module --name=ColoredView --id=net.siso9to.coloredview --android=$HOME/devel/android-sdk-mac_x86

作成したテンプレートプロジェクトをeclipseにimportするとモジュール作成の準備完了です。

モジュールの作成

importしたプロジェクトのパッケージディレクトリの下に、ColoredviewModule.javaとExampleProxy.javaという2つのファイルがあります。


このままでも問題ありませんが、モジュールの方は名前がキャメルケースになっておらず少し気持ち悪いのでColoredViewModule.javaにリファクタします。

eclipseのリファクタ機能だとアノテーション

@Kroll.module(name="Coloredview", id="net.siso9to.coloredview")

のnameの値はリネームされないので、ここは手動で変更します。

また、不要なメソッドやコメントも削除し、ExampleProxy.javaも今回は作りなおすので削除します。

修正したColoredViewModule.javaは以下のようになります。

package net.siso9to.coloredview;

import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.annotations.Kroll;

import org.appcelerator.titanium.TiContext;

@Kroll.module(name="ColoredView", id="net.siso9to.coloredview")
public class ColoredViewModule extends KrollModule
{
	public ColoredViewModule(TiContext tiContext) {
		super(tiContext);
	}
}

最低限必要な記述のみ残したモジュールが出来ました。

カスタムViewの作成

次にカスタムViewクラスを作成します。
カスタムViewを作成するには、TiUIViewを継承したクラスを作成します。

また、ネイティブのViewをカスタマイズする場合はこのTiUIViewサブクラスの中でネイティブViewのインスタンスを生成し、setNativeViewを呼び出してTiUIViewサブクラスに保持します。

package net.siso9to.coloredview;

import org.appcelerator.titanium.proxy.TiViewProxy;
import org.appcelerator.titanium.view.TiUIView;

import android.content.Context;
import android.graphics.Color;
import android.view.View;

public class ColoredView extends TiUIView {

	public class CostomView extends View {

		public CostomView(Context c) {
			super(c);
			
			this.setBackgroundColor(Color.GREEN);
		}

	}

	public ColoredView(TiViewProxy proxy) {
		super(proxy);		

		CostomView costomView = new CostomView(proxy.getContext());
		
		setNativeView(costomView);
	}

}

Proxyの作成

最後に、作成したカスタムViewをモジュールから呼び出すためにProxyクラスを作成します。
カスタムViewを呼び出すProxyを作成するにはTiViewProxyを継承し、TiUIViewの新しいインスタンスを返すTiUIView createView(Activity activity)をImplementsします。

package net.siso9to.coloredview;

import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiContext;
import org.appcelerator.titanium.proxy.TiViewProxy;
import org.appcelerator.titanium.view.TiUIView;

import android.app.Activity;

@Kroll.proxy(creatableInModule=ColoredViewModule.class)
public class ColoredViewProxy extends TiViewProxy
{
	private ColoredView coloredView;
	
	public ColoredViewProxy(TiContext tiContext) {
		super(tiContext);
	}
	
	@Override
	public TiUIView createView(Activity activity) {
		coloredView = new ColoredView(this);
		return coloredView;
	}
	
}

コンストラクタでsetBackgroundColor(Color.GREEN)してネイティブViewに色をつけています。

また、Proxyクラスを作成する際は以下のようにアノテーションのcreatableInModuleの値をモジュール名と一致させる必要があるので注意してください。

@Kroll.proxy(creatableInModule=ColoredViewModule.class)

動作確認用スクリプトの作成

それでは作成したモジュールを動かしてみましょう。

モジュールの動作を確認するためにTitaniumプロジェクトにモジュールを組み込む必要はなく、exampleフォルダ内のapp.jsを使用してモジュールを動かす事が出来ます。

titaniumコマンドで生成されたexample/app.jsを修正し、以下のように記述します。

var window = Ti.UI.createWindow({
	backgroundColor:'white'
});
var label = Ti.UI.createLabel();
window.add(label);
window.open();

var module = require('net.siso9to.coloredview');
Ti.API.info("module is => " + module);

var view = module.createColoredView({
	top: '100dp', 
	width : '100dp',
	height : '100dp',
	color: '#000',
});

window.add(view);

なおモジュールからProxyを介してカスタムViewを呼ぶ際はProxyのcreateViewを直接呼ぶわけではなく、上記のように

create + Proxy名から「Proxy」を抜いた文字列

とする必要があるようです。
これに関しては明示的にドキュメントに記述しているものが見つからなかったので他にも命名ルールがあるかもしれません。また何度か別の名前でProxyを作成した際にうまくJavascriptから呼び出せなかったケースもあったので、使用不可の文字列もあるのではないかと思います。(Tiなど?)

動作確認用スクリプトの実行

app.jsの修正が出来たら、antを使用してスクリプトを実行します。
build.xmlで右クリックし、「Debug As」 > 「2 Ant Build...」を選択します。

Antのターゲット一覧が表示されるので、「clean」と「run」を選択します。
※runのみで実行出来ますが不要なファイルが残っているとビルドに失敗する場合があるので最初にcleanを実行しておく方がよいでしょう


「Debug」を押して実行するとエミュレーターが起動し、以下のように表示されました。
緑色の部分が今回作成したカスタムViewです。

作成したモジュールをTitaniumに組み込むにはAntのターゲットをdistにして実行し、生成したzipファイルをTitaniumのプロジェクトにコピーする必要がありますが、詳しくは公式ドキュメント以前の記事を参照してください。


今回はカスタムViewを作成するための最低限の手順を試してみましたが、titaniumのソースを見ているともう少し複雑なカスタムViewを作成するためには他にも細かなルールがありそうです。

Titaniumはドキュメントが少ない印象がありますがAndroid関連は特に少ないように思うので、早く整備されるといいですね。

参考:appcelerator / titanium_modulesのpaint モジュール

Titaniumの「Module Developer Guide for Android」を日本語化してみた。

TitaniumのAndroidのモジュール作成について調べたのですが、日本語での資料があまり見つかりませんでした。
そこでまず自分の理解を深めるために公式サイトのドキュメントを日本語化してみました。

※意訳したり追加・省略している箇所も若干ありますのでご了承ください。そもそも間違えている箇所もあるかもしれません。

次回以降は実際にモジュールを作る記事を書いていこうと思います。

TitaniumのAndroid用モジュールを作る その3

TitaniumのAndroid用モジュールを作る その1
TitaniumのAndroid用モジュールを作る その2
の続きです。

公式サイトのドキュメントのほぼ直訳ですが若干訳が怪しい箇所があって読みづらいかもしれません・・・

モジュールとプロキシの生成

プロジェクトの初期生成の一部として TitaniumはExampleプロジェクトで使用される2つのクラスを生成します

モジュールの例: src/org/appcelerator/calc/CalcModule.java
プロキシの例: src/org/appcelerator/calc/ExampleProxy.java

Android Titanium API

モジュールとプロキシ (Kroll part 1)

  • モジュールは常に同じ名前でアクセスできる静的なトップレベルのAPIです。Titanium.UIとTitanium.AppはトップレベルTitaniumオブジェクトの下にあるモジュールの例です。
  • プロキシはモジュールや他のプロキシのAPIを通して生成される動的なオブジェクトです。Titanium.UI.createViewでネイティブのViewを生成したとき、そのViewオブジェクトはプロキシです。
  • モジュールとプロキシは両方ともメソッド、プロパティ、定数、getter/setter をjavascriptAPIとして公開出来ます。

モジュール

プロキシ

メソッドとプロパティの公開 (Kroll part 2)

メソッド
プロキシやモジュールのメソッドは@Kroll.methodアノテーションをつけて公開されます。
以下はシンプルな例です

@Kroll.method
public String getMessage() {
    return "Hello World";
}

公開するメソッドが現在のActivityを必要とする場合は最初の引数にKrollInvocationオブジェクトを追加することができます。

@Kroll.method
public String getMessage(KrollInvocation invocation) {
    Activity activity = invocation.getTiContext().getActivity();
}

メソッドには他の多くのプションがあるので@Kroll.methodjavadocを参照してください

プロパティ

プロパティを公開する方法は2つあります

  1. getter/setterメソッドに@Kroll.getProperty@Kroll.setPropertyアノテーションをつける方法。getter/setterメソッドはKrollメソッドとして公開出来ます。(これは普段Titaniumで行われているパターンです)
  2. オブジェクトの変数に@Kroll.propertyアノテーションをつける方法(このパターンはリフレクションを使うので少し遅いです)

この例では、同じ名前のメソッドを公開するだけでなく、messageプロパティのgetterと​​setterを公開しています

@Kroll.getProperty @Kroll.method
public String getMessage() {
        return "Hello World";
}
@Kroll.setProperty @Kroll.method
public void setMessage(String message) {
    Log.d(TAG, "Tried setting message to: " + message);
}

javascrtiptでは以下のように使うことができます

var object = //..
object.message = "hi"; // or
object.setMessage("hi");

定数

定数は@Kroll.moduleの静的プロパティです。@Kroll.constantアノテーションが付けられた変数はstatic finalである必要があります。以下は例です。

@Kroll.module
public class MyModule extends KrollModule {
    @Kroll.constant
    public static final int CONSTANT = 100;
}

定数は直接参照することが出来ます:Ti.My.CONSTANT == 100

ビュー

Titaniumのビューは2つのクラスを持つ必要があります

  • ビュープロキシ:TiViewProxyのサブクラス
    • ビューのメソッドとプロパティのJavascriptへの公開に責任があります。(通常のプロキシと同様の振る舞い)
    • TiUIViewの新しいインスタンスを返すTiUIView createView(Activity activity)をImplementsします。
    • 多くの場合、UIスレッドからUIViewを呼びたくなるでしょう。その場合は@Kroll.method#runOnUiThreadを参照してください。
  • ビューの実装: TiUIViewのサブクラス
    • ViewインスタンスかコンストラクタまたはprocessPropertiesでsetNativeViewを呼ぶ必要があります。
    • ビューの実装クラスはビュープロキシからのデータ取得とそれが公開されているネイティブのViewに直接それを適用するための責任があります
    • クラスはユーザーがプロキシにプロパティを設定したことを通知するpropertyChangedとprocessPropertiesを任意で実装出来ます。

簡単な例としてButtonProxytTiUIButtonでのButtonの実装を参照してください。

HeavyweightなWindowとLightweightなWindow

ユーザーがTitanium.UI.createWindowAPIでウインドウを生成する時、"heavy weight"ウインドウにするべきかどうか判断するためのいくつかのチェックが実行されます。

  • これらのプロパティを持つ場合はheavyweightなウインドウです:fullscreen, navBarHidden, modal, windowSoftInputMode,またはtabOpenプロパティがtrue
  • そうでなければlightweightなウインドウです
  • Heavyweightなウインドウは新しいActivityをスタックに生成し、そして常に自身のために新しいJavascriptコンテキストを生成します。
  • Lightweightなウインドウはフルスクリーンビューを生成します(呼び出し元のコードと同じActivity)。urlプロパティが設定されている場合、ウインドウのために新しいJavascriptコンテキストも生成されます。

スレッドセーフ

メソッドやプロパティがあらゆるJavascriptコンテキスト(と潜在的なあらゆるActivityやスレッド)から呼び出す事ができるので、APIを設計する際のスレッドセーフを意識することが重要です。

メソッドがUIスレッドで実行されるのを保証するために@Kroll.method#runOnUiThreadを使うことができます。以下はサンプルです。

@Kroll.proxy
public class MyProxy extends KrollProxy {
  @Kroll.method(runOnUiThread=true)
  public int doSomething() {
    return 100;
  }
}


3回に分けてモジュール作成のドキュメントを訳したり手順を追ってみましたが、ざっくり訳してみることで理解が深まったと思います。

次回はgithubで公開されているサンプルなどを参考に実際にViewのモジュール作成やモジュールからのActivityの呼び出し等をやてみようと思います。

TitaniumのAndroid用モジュールを作る その2 テストの実行

TitaniumのAndroid用モジュールを作る その1の続きです。
公式サイトを厳密に翻訳しているわけではなく、意訳・追加・省略等を行なってます。

組み込みExampleプロジェクトでのテスト

モジュールプロジェクトにexample/app.jsというファイルがあるので、このファイルにコードを書いてantで実行とテストを行うことができます。
exampleフォルダはTitaniumプロジェクトでいうResourcesフォルダに相当するので、テストのために必要なデータファイルや他のコードをここにコピーして使えます。

Android エミュレーターの実行

コマンドラインから実行する場合、モジュールプロジェクトのディレクトリで以下のコマンドを実行します

ant run.emulator

コンソール上でエミュレータの出力が表示されます

eclipseから実行する場合、起動設定を行います

  • build.xmlを右クリックし、「Run As」 > 「Ant Build... 」(2番目のオプション)をクリック
  • 新しい起動設定の設定ウインドウが表示されます
  • 「Check targets to execute」の下の「dist」ターゲットのチェックを外し、「run.emulator」にチェックします
  • 「Launch Configuration」の名前を「run emulator」のような覚えやすい名前に変更します
  • 以下はcalcモジュールの例です


  • 「Apply」をクリックし次に「Run」をクリックして実行します
  • これ以降はメニューの「Run」 > 「External Tools」からか、ツールバーから実行できます

eclipseのConsoleビューでエミュレーターの出力が表示されます

Exampleプロジェクトの実行

エミュレーターが起動したらExampleプロジェクトの実行準備が完了です。

コマンドラインから実行する場合はモジュールプロジェクトのディレクトリで以下のコマンドを実行します

ant run

eclipseから実行する場合、起動設定を行います
前述したものと同じ手順ですが「run.emulator」ターゲットの代わりに「run」ターゲットを使用します。
設定内容を「run calc project」などの覚えやすい名前にします。

トラブルシューティング
エミュレーターが見つからないために「run」ターゲットがタイムアウトした場合は、以下の2つのコマンドでADBサーバーを再起動してください

$ $ANDROID_SDK/tools/adb kill-server
$ $ANDROID_SDK/tools/adb start-server

この時点でExampleプロジェクトの実行に成功していればデフォルトの「hello world」アプリがエミュレーターに表示されます

モジュールとプロキシのAPIについては次回記述します。

TitaniumのAndroid用モジュールを作る その1

TitaniumのAndroid用モジュール作成はWebで探しても日本語で解説しているところが見当たらなかったので、公式サイトを参考にかいつまんでまとめておきます。
公式サイトを全て完全に訳しているわけではなく、意訳や省略・追加している箇所もあるのでご了承ください。

環境はMac OSX(Lion)、Titanium Studio 1.0.4、Titanium SDK 1.7.2です。
既にTitaniumでのAndroidの開発環境は出来ている前提で記述します。

参考ページは下記です。
Module Developer Guide for Android

環境設定

まずこちらのページに

Environment setup

Follow the instructions in the Titanium Command-line tool Environment Setup section

とあるので、自分の.bash_profileにtitanium.pyへのaliasを設定します。

alias titanium="$HOME/Library/Application Support/Titanium/mobilesdk/osx/1.7.2/titanium.py"

なお「Application Support」のところは半角スペースをエスケープしないとコマンド実行時にエラーになります。
また、「1.7.2」は環境にTitaniumSDKのバージョンに合わせて変更してください。

sourceなどで.bash_profileを読み込み直してからtitaniumコマンドを実行し、下記のように表示されたら成功です。

$ titanium 
Appcelerator Titanium
Copyright (c) 2010-2011 by Appcelerator, Inc.

commands:

  create      - create a project
  run         - run an existing project
  emulator    - start the emulator (android)
  docgen      - generate html docs for a module (android)
  fastdev     - management for the Android fastdev server
  help        - get help

モジュールの作成

先ほど設定したtitaniumコマンドを使用して、モジュールのテンプレートプロジェクトを作成します。
生成するためのコマンドオプションは下記のようなフォーマットです。

titanium create --platform=android --type=module --name=$MODULE_NAME --id=$MODULE_ID --android=$ANDROID_SDK

$MODULE_NAME、$MODULE_IDは任意のモジュール名とIDを指定してください。

  • $MODULE_NAMEは生成されるクラスやjarなどのファイル名に反映されます
  • $MODULE_IDはTitaniumでtiapp.xmljavascriptからモジュールをrequireする際に使用します
  • $ANDROID_SDKandroid sdkを置いているパスを指定します

実際には下記のようなコマンドを実行します。

titanium create --platform=android --type=module --name=calc --id=org.appcelerator.calc --android=/path/to/android-sdk

実行するとカレントディレクトリに--nameで指定した名前(calc)でモジュールのフォルダが生成されます。

モジュールプロジェクトのレイアウト

  • LICENSE - ライセンスを記述するテキスト。作成したモジュールを配布する場合にライセンスの内容を記述するために使用するのだと思います
  • build.properties - Antのプロパティファイル。 Titanium SDKAndroid SDKの場所が記述してあります
  • build.xml - Antのビルドスクリプト。ビルド配布、テストに使用します
  • manifest - モジュールのマニュフェストファイル。バージョン、作者、ライセンス、コピーライト、名前、id、GUID、プラットフォームなどの情報を記述します。
  • timodule.xml - Activityなどモジュール内で使用する情報(通常AndroidManifest.xmlに記述するもの)を記述します
  • hooks - モジュールがプロジェクトから追加/インストール/削除/アンインストールされた場合に実行されるスクリプトがあるディレクトリ。 スクリプトはあるのですが(this is still a WIP)となっていたので実際に使われているのかは不明です
  • documentation - Markdown形式のドキュメントを置くディレクトリ。サンプルが生成されています。
  • assets - モジュールで使用するPNGなどの素材を置くディレクトリ。READMEを読むとjsファイルなどもここに置いておくとプリコンパイルされたpure Javascriptとしてモジュール内で実行できるようです(実際に動作確認していません)
  • lib - サードパーティのJARを置くディレクトリ。ここに入れておくと自動的にプロジェクトのクラスパスとモジュールのzipファイル(モジュールを配布する際に作成)に追加されます
  • src - モジュールのソースコードディレクト
  • example - モジュールを使用したサンプルプロジェクト

モジュールプロジェクトをeclipseに登録

モジュールプロジェクトをeclipseにインポートしてeclipseで開発やビルドを行えるようにします。

  • eclipseのメニューから「File」 > 「Import...」を選択
  • 「General」>「Existing Project into Workspace」をダブルクリック
  • 「Select root directory」の右側にある「Browse...」をクリック
  • モジュールプロジェクトのディレクトリを選択
  • 「Finish」をクリックして登録を完了するとPackage Explorerにプロジェクトが表示されます

モジュールの配布形式(zip)

distフォルダに配布用のzipファイルが生成されます。
zipの命名規則は通常$MODULE_ID-android-$MODULE_VERSION.zipです。

zipファイルには以下のものが含まれます。

  • コンパイルされたクラスが含まれたJARやリソースなどsrcフォルダからビルドされたもの
  • libフォルダのサードパーティJARファイル
  • モジュールのmanifestファイル
  • モジュールのtimodule.xml

eclipseを使用したビルド

モジュールプロジェクトはeclipseでビルドできます。

モジュールプロジェクトのbuild.xmlを右クリックし、「Run As」 > 「Ant Build(最初の方)」を選択します。
eclipseのConsoleに「BUILD SUCCESSFUL」と表示されたら成功です。
プロジェクトをF5などで更新するとdistフォルダが表示され、その中に配布用のzipファイルが生成されています。

モジュールをTitaniumアプリから使用する

モジュールを Titaniumのアプリから使用するには下記のようにします。

  • 先ほど生成したzipファイルをTitaniumアプリ側のプロジェクトルートディレクトリにコピー


  • Titaniumアプリのtiapp.xmlに以下のように追加します
<!-- $MODULE_VERSION should be the same as "version" in the module manifest -->
<modules>
  <!-- <module version="$MODULE_VERSION">$MODULE_ID</module>-->
  <!-- For example, if we were adding the calc module: -->
  <module version="0.1">org.appcelerator.calc</module>
</modules>

モジュールを読み込むためにrequireを使用します。

var Module = require('$MODULE_ID');

calcモジュールの場合は以下のようにします。

var Calc = require('org.appcelerator.calc');

アプリが起動またはビルドされるタイミングでモジュールのzipが自動的に展開されてアプリに読み込まれます。

長くなったのでテストやメソッドの呼び出しは次回記述します。