Androidの課金モジュールTi.InAppBillingの実装方法 その1

iPhoneのアプリに課金モジュールTi.Storekitは実装したけれど、
Androidのアプリ内課金実装に関する日本語の情報がほとんどないのでまとめてみる。

Titanium Market PlaceからDL。公式のモジュールだ。

In-App Billing Module
https://marketplace.appcelerator.com/apps/776?953395159

レビューを見ると早くも不吉なコメントが...
Crash! 等...

エミュレーターで起動してみるものの、どうやら実機でないと
実際の課金に関するテストできないらしい。
続きはその2で...

Titanium 1.8.1で画面の向き変更が効かなくなっていた件

iPhoneシミュレーターでTitanium.UI.Orientationが効かなくなっていたので試行錯誤して
やっと解決法が見つかった。
向きを変えたいオブジェクトに以下のようにコード追加すればOK。
Orietantionの種類はPORTRAITでもLANDSCAPE_LEFTでも使用可能。ケースに併せて書き換えて下さい。

var win = Titanium.UI.createWindow();
win.orientationModes = [Ti.UI.LANDSCAPE_RIGHT];
Titanium.UI.orientation = Titanium.UI.LANDSCAPE_RIGHT;

ちなみに1.8.0.1でビルドしても駄目。1.7.5で仕様変更があった模様。
以前はこう書いていたのですが。

Titanium.UI.orientation = Titanium.UI.LANDSCAPE_RIGHT;

1.8.0以上は(マニュアル通りきちんとコードを書いてなかった場合)対応が必須ですね。

Titanium SDK 1.8.1でしてしまう問題

SDKを2週間遅れ(2012/2/15リリース)で1.8.1にバージョンアップしたが、
ビルドできないので焦った。

プロジェクトの設定からエラーの出力レベルを最高の「trace」に変更。すると、
以下のようにpythonコンパイルエラーであることがわかった。

ImportError: No module named simplejson

1.8.0.1まではjsonモジュールがいらなかったのだが、1.8.1から必須になった模様。
以下のコマンドでインストールする。(僕はmac利用なのでwindowsの方注意)

sudo easy_install simplejson

なんとか直った。。
焦りました。

アプリ内課金はTi.Storekitがベストソリューション(2011.11現在)

Titanium/iPhoneのアプリ内課金はいろいろなやり方があって一定しない。
今年の4月〜5月くらいまではmasuidriveさんのつくったjp.masuidrive.ti.storekitが広く知られていたよう
だけど、SDK 1.7.xでは動作しないとの報告も見かける。→Selfkleptomaniac — TiStorekitを公開しておきました

Appcelarator公式のTi.Storekitというライブラリが登場したので保守は事実上行われなくなっている模様?

http://www.appcelerator.com/products/titaniumplus/によると有料のモジュールにTi.Storekitが含まれているように見受けられるが、
実は最近無料でも利用できるようになった。https://marketplace.appcelerator.comから検索すると出てくる)

参考記事:http://developer.appcelerator.com/question/126737/is-tistorekit-now-free

ということでおすすめ。簡単だが導入手順の記事もある。
http://wiki.appcelerator.org/display/guides/StoreKit+Module+In-App+Purchase+Testing

Ti.UI.Window.close()ではメモリが解放されない

http://code.google.com/p/titanium-mobile-doc-ja/wiki/Tips

wikiのTipsページ以外に日本語ではほとんど情報がないが、結構重要な問題だと思う。
TabでWindowを管理している場合は大丈夫なんだけど、windowの中でwindowを開いている場合は
以前のwindowは保持されてしまうので対策が必要。

対策はこれから調べる。

※2011/10/16 追記
Titaniumではあるwindowから他のwindowをjavascriptファイル参照する場合、
別スレッドとして開いてしまうらしい。
そして、一見すると自分自身=最新のwindowだけを参照していたように見えたTi.UI.currentWindowは
グローバルなwindowを参照していたようだ。だから、

var window = Ti.UI.currentWindow();
var newWindow = Ti.UI.createWindow({
url : "new.js",
});
newWindow.open();

window.close();

とすると、jsの呼び出し元と呼び出し先の両方のwindowが消えてしまうのだ。
メモリが消えても呼び出し元のwindowだけ消せないようでは意味がない。。

解決策としては以下のページのようにapp.js内で分岐を作るシングルスレッドで
対処するしかないのだろうか。

http://developer.appcelerator.com/question/1261/memory-alocating-with-titanium-mobile

Yahoo!API宛にアクセスができない

http://ti.masuidrive.jp/topic.php?id=18
ここの
>AndroidでTitanium.Network.createHTTPClient.onloadなどが実行されない
の件。知恵袋APIだけでなく全体的にUAでの制限がかけられている模様。

今後Titanium/AndroidではUAを意識してAPIへアクセスすべきか。