T

決戦!Titanium 対 PhoneGap

結論:文句あったらプラグイン書けばまあたいていどっちでもなんとかなるYO!

以上。

PhoneGap (Android)でローテーションの固定

Titaniumでも同じような手が使えたので試してみたら大丈夫だった。

AndroidManifest.xmlで各Activityのところを(portraitで固定したいなら)こんな風に記述する。

android:configChanges="keyboardHidden"←ココ
android:screenOrientation="portrait"

keyboardHiddenからあとの部分を消す。

Titanium DeveloperとXcodeの連携

Titaniumで作成したプロジェクトをXcodeでビルドする際に必要なファイルをコピーしてくれるスクリプトがAppceleratorの開発者の好意で用意されている

残念ながら日本語を含むディレクトリ名が途中にあると動かないようなので、ちょっといじってこちらに置いておいた

Titanium DeveloperでAndroid(5)

今まで見つけた、Androidの場合に起きる不具合について。

(1) httpClientでPOSTリクエストが送れない、外部とのsocket通信ができない

これは笑っちゃうようなレベルの不具合で、よくもまあリリースしたもんだと飽きれる。HTTPによる非同期通信を起動しても、POSTリクエストで値を送信することができない。じゃあsocket通信でなんとかしようと気合いを入れ直すと、実はAndroidではsocket通信も動作しない

対応方法は、GETまたはリクエストヘッダに細工してデータを送るくらいしかない。次期リリースで改善されるという噂だが、どうだろう。正直まだあまり信用できない。

(2) 暗黙のIntentで適切なメディア再生用アプリケーションが起動できない

Intentで直接メディアプレーヤーやPDFビューワを起動したくても、いったんブラウザが起動してからブラウザ経由で呼ばれてしまう。

対処方法としては、AndroidManifest.xmlにIntentFilterを記述してやればいいようだが、時間がなかったのでIntentを作成している箇所をいじってTitanium mobileの機能を拡張した。ちょうどここにやり方が出ていたのでこれをヒントにやってみたらうまくいった。

(3) MediaPlayerがサーバ上のデータにアクセスできない

驚いたことに、KitchenSinkからリモートサーバのメディアへのアクセスがAndroid版から削除されていた。これはどうしようもないので、(2)と同じようにTitanium mobile側を改造するか、諦めるしかない。

というのも、例えばUIWebViewでHTML5のvideoタグを使ってメディアプレーヤの代用としてみても、Androidではアプリ内から起動するwebviewではvideoタグは起動しない仕様なので、いくら頑張っても無駄になる。

ただし、(2)の方法を使うと、openURLの改造でIntentが思い通りに動くようになるので、その場合はTitanium.Platform.openURL(またはそれを拡張した関数)でリモートのURLを呼び出してしまえばいい。メディア再生用の別アプリケーションが立ち上がるが、iPhoneと違ってAndroidなら再生が完了したらまた自分のアプリに画面が戻る。

(4) orientationの制限がまともに動作しない

これはAndroidManifest.xmlをいじって対応できる。まあ、魔術としかいいようがないが。

これらはいずれもiPhoneでは正常動作しているものが、Androidに限って動かないケース。繰り返しになるが、よくまあリリースしたもんだ。

Titanium DeveloperでAndroid(4)

いろいろと発見することが多い反面、だんだんとまとまりがなくなっていくシリーズ。というか、Androidがマジで嫌いになってきましたシリーズ。

AndroidのUIWebViewが曲者だ。例えばcreateWebViewして、その中のHTMLにvideoタグを埋め込んで動画再生しようとしても、iPhoneでは動くのにAndroidでは動かない。

じゃあ、どうすればいいか?調べると、Titanium側でcreateWebViewした際にUIWebViewのインスタンスにsetPluginStateまたはsetPluginsEnabledが設定されていないので、Titanium Mobileのソースコードを眺めて、webviewの作成時にはsetPluginsEnabled(true)を呼ぶように指定してリビルドしてみたが効果がなかった。そこでさらに調べてみると、どうやらアプリ内で作成されるviewからはHTML5の機能が動作しないのが仕様らしい。

これだけならAndroid師ねで終わるのだが、驚いたことに今度はTitanium側からもキツい攻撃が。リモートのファイルを普通にcreateVideoPlayerに設定しても、例外を吐いてクラッシュする(Androidのみ。当然iPhoneでは動く)。

.......
//どこかの大自然
var media_url = 'http://www.pocketjourney.com/downloads/pj/video/famous.3gp';
var activeMovie = Titanium.Media.createVideoPlayer({
  contentURL:media_url,
});
win.add(activeMovie);
win.addEventListener('close', function(){
  alert("Window closed");
  activeMovie.stop();
});
activeMovie.play();
.......

まとめると:

(1)AndroidではvideoタグのようなHTML5の機能をアプリ内のwebviewから利用することは出来ない。これはAndroidの仕様なので、PhoneGapを使っていても同じ目に遭う

(2)Titanium Mobile (SDK 1.5)ではAndroidでcreateVideoPlayerからリモートの動画を読み込むことは出来ない。

つまり、Androidでリモートの動画を再生したければ、aタグでちょちょいとやっつけるか、PhoneGapでプラグインを作成するか、またはちゃんとJavaで書くしかない、ということ。プロジェクトをeclipseにエクスポートする機能は公式には存在しないが、いちおうスクリプトが用意されてはいる。