T

SwiftとTitanium

Objective-Cと並んでiOS用アプリの開発に利用できる言語、Swiftが発表されました。私たち歌と踊りが大好きな陽気で愉快なTitaniumユーザーとしても注目すべきニュースです。

Titaniumとは、ご存知の通り、アプリの上にJavaScript実行環境を用意して、JavaScriptを通じてアプリを実際に動かすネイティブのAPIを叩いてしまうツールです、というとわかりにくいですが、ようするにネイティブのAPIで動作するアプリがJavaScriptで書けてしまう素敵なツールです。インストールガイドを辿るくらいの手間をかけるだけで簡単にセットアップできる上に、Node.jsなどモダンなJavaScriptの知識を活かして大規模なプログラムを作成することも可能です。ややこしい設定もなくiOSやAndroidなどに対応し、慣れたユーザーなら複数のプラットフォームで動作するアプリを短期間で開発することができます。

さて、Titaniumはこれまで、JavaScriptで書かれたプログラムをアプリの上で動作するJavaScript実行環境が評価して、その結果をネイティブな環境とやり取りする仕組みで動作するものでした。しかし、現在開発中の次期バージョン、Ti.Nextと呼ばれている新しいシステムでは、JavaScriptに独自拡張を施した言語で記述するとそれらをObjective-CやJavaといった言語にコンパイルして、文字通りネイティブアプリにしてしまう仕組みが導入される予定です。本当はJavaScriptがそのままObjective-Cに変換できればいいのでしょうが、さすがにちょっと記述するのが難しいので独自の変更が入っています。おそらく、現在JavaScriptとXMLでTitaniumのアプリを作成するAlloyフレームワークがあるので、ユーザーは新しい変な言語を覚えるのではなく、これまで通りAlloyでアプリを作成すれば、その他のツールチェインがよろしく取りはからってくれるよう、いわばAlloyがDSLとして機能するようになると予想されます。Alloy自体はBackbone.jsのModelやCollectionを取り入れたBackbone.js + Underscore.jsみたいな最近よくあるJavaScriptのMVCフレームワークに似たところもあるので、慣れてしまえば結構便利です。

そこへ話題のSwiftの登場となるわけですが、RubyMotionのような開発環境を提供しているサードパーディーのコミュニティは割と早めに反応しているようなので、TitaniumとSwiftのこれからについても、簡単な展望を予想してみたいと思います。このSwift、ざっと眺めたところJavaScriptとかなりよく似ています。少なくともObjective-Cの文法に追随するためのヘンテコな仕組みを必要とせずJavaScriptからのコンパイラも作成しやすいように見受けられます。そのため、特にTi.Nextのような仕組みはiOSに関しては飛躍的にTitaniumに有利になるでしょう。Swiftを覚えなくても馴染みのあるJavaScriptで記述できる上に、単純な仕組みのコンパイル部分を理解すればいろいろな応用が出来るはずです。TitaniumはバックエンドはAndroidやTizenなどプラットフォーム毎に切り離されているので、Titanium自体の開発者にとってはそれぞれに合わせてネイティブの言語でAPI層を構築するのが大変でしたが、その手間がかなり軽減されそうです。そして、それはJavaScriptでクロスプラットフォームのアプリを作成する利用者にとっても大きなメリットになるでしょう。

Titaniumの使い方として、まだObjective-CやAndroidのJavaにあまり精通していない人でも、とりあえず動作するものが作れてしまう利点を最大限に利用して、動くものを作りながら、徐々にプラットフォーム毎の仕組みを理解し、やがてはそれぞれのネイティブな言語での開発を始めるに至るブリッジの役割を求めるケースが最近増えてきているように思われます。そんな意味では、Swiftを活用するのはいったんエキスパートに任せて、JavaScriptからSwiftを利用しつつ徐々に学んでいくのも悪くないと思います。なんといっても動く製品がなければビジネスも何も始められませんからね。

そうそう、METALが発表されましたが、このあたりはLanicaの人たちに頑張ってほしいですね。

Titanium™ Advent Calendar 2013

Titanium™ Advent Calendar 2013」12/4はユーザー会の名ばかり会長が担当です。肩書きは偉そうですが、活動といえばもっぱらサポート係をやっています。サポートサイトを見るといつも同じやつがレスつけてんな、と思う方もいらっしゃるでしょうが、趣味なので止めないでください。まあ、まだまだ至らないことがたくさんありますが、今日はそのあたりのことについていろいろとお話しします。

サポートサイト用自動運転ボットと化した自分の手元の環境には常にSupportとSupportAlloyというプロジェクトが用意されています。サポートサイトに質問があると、このどちらかに検証用のコードを書いて試しています。なので、質問の際はAlloyかどうかを書いてもらえると助かります。検証用のプロジェクトの中身のJSは時に数百行になっていますが、これは前の質問の検証用コードをコメントアウトして継ぎ足して使うことが多いからで、実際には数行で動かしています。最近ではsamplemoduleとiOSSampleModuleいうモジュール用のプロジェクトもあります。もちろんモジュールの試験用です。

もうずっとこの活動をしていますが、やっていてよかった点は:

Pros

そんじょそこらの人よりずっと詳しくなった

わからないとソースコードを調べることができるのがFOSSのいいところなので、質問を受けてわからなければObj-CやJavaのレベルまでなら降りて調べています。そのためずいぶんとTitaniumの中身について詳しくなりました。逆に、おそらくAptanaの抱える権利関係のあれやこれやで公開されていないTitanium Studioなど普段Eclipseも使わないのでこれっぽっちもわかりません。

SDKに勝手に手を入れてオレオレSDKを作るのはあまりおすすめできるやり方ではありませんが、慣れてくるととても簡単なのでついついやってしまうんですよね。それが割と気軽に出来るのも、日頃のサポート活動のお陰だと思います。

さらにいうと、これのお陰でJavaだろうがObj-Cだろうが普通のアプリくらいなら書けるようにもなってしまいました。なので、これからアプリ開発を始めたいというウェブ開発者のみなさんには、入門としてTitaniumというのはそう悪くない選択肢だし、学びながらも結果を出せるところもいいよとお勧めしたいです。

知らない機能を触って練習できる

iOSもAndridもこれだけ豊富な機能を備えているのですから、案件や自分のアプリで要求されない限り触れることはない機能はたくさんあると思います。サポートサイトをやっていると、擬似的に案件を受注するようなものですから、いい練習になります。それに、たとえわからなくても、案件と違って失うものは何も無いので、社会的信用に関わると震え上がる必要はありません。一度でも触ったことがあるAPIならともだちだよね、という感じで口笛吹いて空き地に出かけてもいいと思います。

ときどき仕事になる

これは思わぬ副産物ですが、最近ではサポートサイトには出せないので案件として改修を受注するケースが増えてきました。基本的には副業なのであまり深くコミットすることはありませんが、普及活動として基本的には知っている情報は目一杯お伝えすることにしています。おそらく今後もこのようなケースは増えるでしょうから、サポートサイトでも有償の案件として開発者を募集する仕組みを導入するのがいいかなと考えています。サステイナブルなサポートはマネタイズできるスキームがASAPに明後日の方向へWIN/WINがマストなお部屋探しです。ジャストアイデアですが。

あと、来年からTitaniumの講習を都内で平日夜に定期開催するかもしれません。詳しいことが決まり次第お知らせします。

「Titaniumの人」になれる

お歳暮にハムを贈るだけでハムの人にはなれますが、Titaniumを贈ってもなかなかそうは呼ばれません。しかしユーザー会を立ち上げたりサポートサイトを運営していると、開発者向けのイベントなどにお呼びがかかることがあります。大変ありがたいことです。この2月にイベントのために急遽作成したユーザー会の名刺も年内に全て配り切ってしまいました。やはり、なんだかんだといって、エンジニア同士は横のつながりがとても大事です。今後も可能な限りいろいろなところに出向いていきたいと思います。しかし、本当はもっと全国のイベントに参加したいのですが、なにぶん当方とても貧乏な3人の子持ちのフリーター40歳なのでそれほど潤沢に自由な時間とお金があるわけではありません。そこで、ユーザー会のみなさんにも、もし積極的に関わって頂けるのであれば、もう勝手に支部長とか名誉会長とか本家とか裏組織とか北斗琉拳とか自由に名乗っていただいて結構なので、是非Titaniumの人として各地のイベントに出没してください。

もくもく会でも、知らない方に声をかけて頂けるとそれだけで横の世界が広がっていくので、ありがたいことです。

Cons

と、いい面ばかりを強調しましたが、それはもちろんこの後に課題を挙げるためです。先にいいことを書くのは文章作成の基本だそうですから。

サポートサイトを運用していて気づいたのですが、この広い世の中にはサポートサイトにさえ辿り着かずに消えていく・不満を抱えたまま別のプラットフォームに鞍替えしてしまうケースがたくさんあるようです。いくつかよくあるパターンを挙げてみると:

インストールが出来ない

Titaniumは、いうなればmoving targetなので、常に変化しています。新しい機能を追加する方が優先で、UIの固定などにはあまり興味がありません。そのため、インストールの方法も変化しています。ウェブ上にはたくさんの情報があり、少し検索するだけでたくさんの詳細な(時には動画まで用意された!)インストール手順が見つかります。しかし、当然ではありますが、それらはTitaniumの変更に合わせてアップデートされているわけではありません。そのため、せっかくTitaniumを試してみようとしても、ここで困惑してしまい先に進めない方も大勢いらっしゃるようです。この状態でユーザー会のサポートサイトに来る人はあまりいませんので、大変残念な結果となってしまいます。

ちなみに、Titaniumの書籍をものすと直後に何かしらUIの変更があるというのはジンクスとなっています。

この問題を解決する方法は、ユーザー会としてメンテナンスするインストール手順のページを用意することだと思います。と書くと簡単なようですが、実はこれは結構面倒くさい作業です。ユーザー会でアクティブに活動するような人たちはたいていそれなりのスキルを備えていて、インストール時に経験した問題など自力で解決してしまうことがほとんどです。またTitanium歴が長ければそれだけ最後にインストールしたのはずいぶん昔だったりするので、今更どうやったのか思い出すだけでも一苦労です。おそらく理想的なのは、開発よりも開発環境そのものに興味があり、クリーンインストールしても惜しくない環境を維持できている人材なのですが、そうそう見つかるものではありません。もし我こそはという方がいらっしゃれば、ユーザー会の方でWikiページを用意したので、是非インストール方法を解説するページを作ってもらえるととても助かります。

いまさらっと書きましたけど、ここすっごい大事ですよ。Wikiなのでみなさんのご協力があればとてもいいことがあると思うんですよ。@donayama さんが作ってくれていた過去の資料なんかも統合できれば最高じゃないですか。

どうやって書いたらいいかわからない

一時期、まだTitanium黎明期の頃、おそらく2年か3年くらい前に、「私はこう書いている」というエントリがいくつか立ち上がり、Titaniumでアプリを作るにはそもそもどういうやり方をするのがベストなのかをユーザー同士で探り合っていたのを覚えています。上のインストールと同じく、実はTitaniumで書くJavaScriptについても推奨されるやり方はいくつかの変遷を辿り、今日ではおおまかに2つのパターンに収斂してきたといっていいでしょう。これも、ウェブ上のドキュメントでメンテナンスされ続けているものがなく、古い情報が残ったままになっているので、なんとかしなければいけない状況です。最近、仕事としていくつか既存のプロジェクトのソースコードに触れる機会があったのですが、半分くらいは古い資料を元に構築してしまい困っているケースでした。もうある程度動いているプログラムを根本的に改修するのは基本的に愚かなことなので対症療法的になる方がいいはずなのですが、この場合はどうしても根治療を目指さざるを得なくなるので困ったものです。

今後のあらゆるTitaniumのプロジェクトは、Ti.Includeを決して使わず、塩分控えめなシングルコンテクストで書くべきであり、それほど複雑なものでなければなるべくAlloyを使うべきでしょう。Ruby on Railsはもうずいぶんと長いことウェブアプリケーションフレームワークの中でも最も影響力のある立場にありますが、初心者向けのドキュメントが熱心にメンテナンスされていることでも特筆すべき存在です。書籍もずっと改訂されており(まあそれだけ売れてるってことなんでしょうね)、見習いたいと思います。

もし可能であれば、お題を決めて一緒にアプリを作るイベントとかやるといいかもしれないですね。嫌らしい話をすると、本来は公式トレーニングがこの役目を果たすべきなのでしょうが、とってもお高いですし、なんといっても今年から国内では提供されなくなりましたので、もうユーザー同士でなんとかしてしまうしかないと思います。親切なことに教材は公開されていますからね。

大きな声で繰り返しましょう、もっと大きな声で!:

  • Ti.Includeは使わない!
  • createWindowにurlプロパティは使わない!
  • ループの中でfunctionを作らない!
  • グローバル空間を汚染しない!

猿があなたを見つめています。

* ユーザー会の方でWikiページを用意したので、この辺も載せていきたいですね。

他人のせいにしたい誘惑

もう何年も前のことですが、とある会社内でTitaniumについて本国のベンダに問い合わせしたい項目を募集したところ、集まってきた答えに愕然としたことがあります。例えば「JavaScriptではtrueになるはずのif文にtrueが返らない不具合がある」といったものがずらずらと並んでいたのです。仕組み上、JavaScriptを実行している部分は既存のV8などなので、まあ間違いなくお書きになったJavaScriptの方が間違っているわけですが、案件で切羽詰まっているとついつい「自分のせいじゃない」と主張したくなってしまうのが人間というものです。その点、TitaniumはObj-CやJavaのAPIを抽象化している存在なので、開発者から見れば問題はそこにあるに違いないように感じられるものですから、うまくいかないときはすぐに集中砲火を浴びる性質があります。もちろんここに不具合がないというわけではなく、それどころか結構○○なこともよくあったわけですが、それでも、ちょっと考えればソースコードは全部見られるのですから調べればすぐにわかります。またググるだけで結構な情報が得られることにもすぐ気づくと思います。というわけで、私は個人的にはもちろんTitaniumにも欠点はあり、そこから離れてしまうユーザーもいるのは当然で、むしろ卒業みたいな感じで飛び立ってくれるならたとえ大恩あるChatWorkさんでも喜んでお見送ります(qnypは許さないといっているわけではありません)。しかし、ロクに調べもせずに他人のせいにしたい誘惑に駆られただけの文句であれば、世論と予算が許す限りは顔を出してちょっと待ったとお節介にも口を出します。お代を頂ければコードも出します。研修だってします。JavaScriptへの愛が足りない人間には容赦しない、これは鉄則です。繰り返します。汝の隣人と汝自身より少しだけ多くJavaScriptを愛しなさい。猿があなたを見つめています。

というわけで、駆け足に振り返りすぎていろいろ振り切ってしまいましたが、来年はもう少し活動領域を広げて、開発の方にも力を入れていきたいと思います。なんと今年はモジュールばっかり書いて全くアプリを作っていないんですよね。モジュールのサンプルアプリしか書いていない。他人のJavaScriptって基本的には誰にとっても読むのは苦痛ですが、そんなことばっかりやってたらよろしくないので、たまにはひっでえJavaScriptを恐れ多くも他人に読ませる側にまわりたいと思います。わっはっは、誰も恐怖からは逃れられないのだ。

明日は @h5y1m141 さんだよ!猿があなたを見つめています。

Titanium夏期講習

8/17、クリーク&リバー社様主催、Titaniumユーザー会による初心者向け講習を実施しました。当日はTi関連イベントなのに珍しく晴天に恵まれたので、いつも雨を降らせている犯人はぼくや@ryugoo_@h5y1m141ではないことがほぼ確実になりました。

大勢の方にご参加頂きましたが、告知から会場の準備や誘導など滞り無く運用して頂けましたので、C&R社様には改めて御礼申し上げます。

午前中はぼくがずっとしゃべりっぱなしで、Titaniumについての説明と今後の展望などについてのおおまかな解説をしました。こちらに公開していますのでご笑覧下さい。

20130817 Titanium勉強会(午前) from Toshiro Yagi

20130817 Titanium勉強会(午前2) from Toshiro Yagi

午後からは3つのクラスに分かれて実習となりました。少々暴走気味な解説もあったかもしれませんが、JavaScriptへの個人的な偏愛がみなさまに少しでも伝染すれば伝わればうれしい限りです。ソースコードはこちらから入手できますので、ご活用ください。

それから、Appceleratorが提供している教育用の資料の閲覧方法はこちらです。TCDの方はこちらで作業を進めています(さぼりすぎですね、がんばります)。

それにしても、お盆休みの期間にも関わらず大勢の方にご参加頂き、大変ありがとうございました。限られた時間の中でどれだけ必要な情報を届けることができたのか、不安なところはありますが、皆様の熱意に少しでも応えられるようにこれからも機会を見つけてこのような講習を続けていきたいと思います。

次回からは、ダウンロードが必要なソフトウェアは事前にUSBメモリか何かに用意してさっと進められるようにしたいですね。今回の反省点として次に活かしたいです。

2013年のTiIconicFont + Alloy

ウェブ上の情報が少し古くなっていたようでいくつか質問があったので、現時点で動作するサンプルをまとめておきます。あすとろなんだっけかさんの『Titanium mobile “early” Advent Calendar 2012』の18日目、@hoyo1111 さんのエントリー『【18日目】AlloyでもTiIconicFontを使いたい』を参考にしています。というかこれをほぼまるまる使っています。書き方を入門者に対応しただけですね。

TiIconicFontはサイレントヒルのひげ怪人Titaniumユーザー会ではおなじみのk0sukeyさんが公開してくれている、Font AwesomeやLigature Symbols、SS PikaのようなウェブフォントをTitaniumのLabelでも利用できるようにするモジュールです。インストール方法は次の通りです:

(1)ダウンロード

Alloyのプロジェクトはもう作成しましたね?まだなら、先に作成しておいてください。

TiIconicFontはGithubのページからZIP形式でダウンロードしたりgitでcloneして入手します。

(2)展開

Zipで落とした人はTiIconicFont-masterとかいう名前のディレクトリの下のResources/lib、cloneした人はTiIconicFont/Resouces/libを自分のAlloyのプロジェクトのapp/assets/以下にコピーします。app/assets/libディレクトリが作成されていることを確認しましょう。

(3)フォントデータの用意

TiIconicFontはそれだけでは動作しません。フォントのデータ(ttf)ファイルが必要です。例えばFont Awesomeならプロジェクトのウェブサイトからダウンロードして、展開したディレクトリのfont/fontawesome-webfont.ttfをapp/assets/fonts/以下にコピーします。app/assets/fontsディレクトリは存在しないので作成してからコピーしましょう。

app/assets以下にこれらが用意されればOKです。

app/assets/
├── fonts
│   └── fontawesome-webfont.ttf
└── lib
    ├── FontAwesome-deprecate.js
    ├── FontAwesome.js
    ├── IconicFont.js
    ├── LigatureSymbols-deprecate.js
    ├── LigatureSymbols.js
    └── ti.ss-pika.js

(4)iOS用の設定

iOSの場合は必要なファイルを生成するためにいったんビルドします。ビルドして作成されるbuild/iphone/Info.plistをプロジェクトディレクトリの直下にコピーして、コピーした方のファイルの最下部(/dictの上)に以下を追記します。Androidの場合は無視して地球の未来のことを考えます。

	<key>UIAppFonts</key>
        <array>
          <string>/fonts/fontawesome-webfont.ttf</string>
          <string>/fonts/LigatureSymbols.ttf</string>
          <string>/fonts/ss-pika.ttf</string>
        </array>

(5)動作試験用のViewを用意

app/views/index.xmlに下のような記述を用意します。

  <Label id="symbol" />

app/styles/index.tssにも適当な値を設定しておきましょうか。

"Label": {
  width: Ti.UI.SIZE,
  height: Ti.UI.SIZE,
  color: "Black"
}

(6)動作試験用のcontrollerを用意

app/controllers/index.jsに次のように記述します。

// Font Awesome
var fontawesome = require('lib/IconicFont').IconicFont({font: 'lib/FontAwesome'});
$.symbol.setFont({fontSize: 32, fontFamily: fontawesome.fontfamily()});
$.symbol.setText(fontawesome.icon('icon-thumbs-up'));

$.index.open();

Font Awesomeで利用できるアイコンの一覧はlib/FontAwesome.jsにあります。

(7)自慢

awesome_android

ImageAsResized更新

AndroidにもTiBlobの機能としてImageAsResizedが実装されたにも関わらず細々と利用されているImageAsResizedモジュールですが、Titanium側の仕様変更に追随していなかった部分を更新しておきました。2.0系に合わせて更新して以来の変更です。今回の変更でローカルファイルのリサイズが正常に動作するようになりました(これまでもTiBlobを渡せば動いていたんですが)。

特徴は、回転に対応していること、支点と距離を指定すると切り取りにも対応していること、元画像とプロポーションが違う大きさにリサイズしようとすると勝手に切り取られること(仕様です)。

// Resources以下のファイルは先頭に「/」があってもなくても大丈夫です。
// SDCARDの中のファイルはTi.Filesystem.externalStorageDirectoryでフルパスを渡します。
var androimage = require('org.selfkleptomaniac.ti.imageasresized');
var image_data = androimage.imageAsResized(width, height, "images/boy.jpg", 0);
var rotated_image_data = androimage.imageAsResized(width, height, "/images/boy.jpg", 90);
var sd_card_image = androimage.imageAsResized(width, height, Ti.Filesystem.externalStorageDirectory + "tmp.jpg", 0);

// ちなみにimage_view2は90度回転しています。
// そう、回転にも対応しているんです。
var image_view1 = Ti.UI.createImageView({image:image_data, top:20, canScale:true, width:width, height:height});
var image_view2 = Ti.UI.createImageView({image:rotated_image_data, top:20, width:height, height:width});
var image_view3 = Ti.UI.createImageView({image:sd_card_image, top:20, width:width, height:height});

wrap.add(image_view1);
wrap.add(image_view2);
wrap.add(image_view3);

結果はこんな感じ。

resized_mame

「LINEで送る」をTitaniumで

ということで調べてみると、マニュアルが見つかりました。カスタムURLスキームが用意されていて、LINEではAndroidはローカルに保存した画像のパスを、iOSではClipboardに貼付けてClipboardの名前を渡すことで実現できるそうです。なんだ簡単、と思ったら、TitaniumではiOSのClipboardの名前が取得できないんですね。

そういえば誰かがモジュール作ってたなあ、と思って調べると、確かにありました。「TiCustomPasteboard」ですね。終了〜。と思ったら、テキストしか扱えないとのことなので、画像を扱えるようにしておきました

これで、たぶんiOSなら動くはず。

var Pb = require('jp.hsj.ticustompasteboard');
var pb = 'org.selfkleptomaniac.myapp.pb';
Pb.createPasteboard(pb);
Pb.setImage(pb, imageBlob);

var message = "言いたい事は山ほどある";
var mime = 'image/png'; //画像に合わせてね
Ti.Platform.openURL('line://' + message + '/ ' + mime + '/' + pb);

終了〜

ところが。これでおしまいと思ったら、donayamaさん曰く

ただ、名前が名前のモジュールなのでString以外の要素(Colorとか諸々)のやりとりを行えるように、いつかはしないとダメでしょうね…(^^;

とのことなので、色も扱えるようにしないといけないみたいですね。機会があったらまた今度。残念。

TiTwilio

TitaniumでTwilioを簡単に扱うためのモジュール、TiTwilioを公開しましたので、使い方を説明します。Android、iOS共通です。

最初にTwilioのアカウントを作成します。電話番号を取得したら、次にアプリを登録します。自分が用意する認証サーバとTwilioを連携させるために必要なので、必ず登録してください。

tw1

「TwiMLAppを作成する」ボタンから登録することができます。

大事なのは、Request URLのところです。認証が始まってCapability Tokenを取得した端末は、このRequest URLにPOSTリクエストを発行します。このリクエストへのレスポンスでアプリの挙動が決まります。
tw

TiTwilioでは、リダイレクト時にサーバに指定されたパラメータを追加する機能があります。Titaniumで作成したアプリと認証サーバ間との連携に利用します。実際のコードで説明します。

var TiTwilio = require('org.selfkleptomaniac.mod.titwilio');

// call
TiTwilio.connect({
  url: 'http://your-auth-server.example.com', // auth server (required)
  params: {key: value, post: data} // post data (optional)
});

これだけのコードで上の図の一連の動作が実行されます。paramsに指定した値がPOSTリクエストのキーと値としてRequest URLに送信されます。従って、サーバ側ではこのparamsによってアプリ同士の通話や携帯・固定電話への通話、自動返信などの挙動を変えることができます。

githubのレポジトリにはsinatraで動くRubyのサーバ側スクリプトがserverディレクトリにあります。こちらではRequest URLに「/call-to-me」で終わるURLを指定するようになっています。POSTで送信するtypeの値によってアプリ間通信や携帯・固定電話への通話など機能が分離しています。

アプリ間の通信や携帯・固定電話からの通話を受け付けるためには、認証サーバにログインしている必要があります。Androidの場合はPendingIntentに受信時に起動するサービスを登録しておきます。

var TiTwilio = require('org.selfkleptomaniac.mod.titwilio');

var pendingIntent;
if(Ti.Platform.osname === 'android'){
  var intent = Ti.Android.createServiceIntent({url:'service.js', twilio: TiTwilio});
  pendingIntent = Ti.Android.createPendingIntent({intent: intent});
}

// login
TiTwilio.login({
  url: 'http://your-auth-server.example.com', // auth server (required)
  params: {key: value, post: data}, // post data (optional)
  pendingIntent: pendingIntent
});

これで受信の準備が完了します。iOSの場合はincomingCallイベントをTiTwilioオブジェクトに追加するだけで受信することができます。

Androidの場合は、Resources/android/以下にservice.jsを用意します。通話を受信するたびにこのサービスが起動しますので、ダイアログを出したりするなど受信時の動作をアプリケーションレベルのイベントに登録しておいて、それをこちらからfireEventで呼び出します。

try{
  var service = Titanium.Android.currentService;
  var intent = service.intent;

  Ti.App.fireEvent('inComingCall', {intent: intent});
  service.stop();
}catch(e){
  Ti.API.info(e);
}
service.stop();

サービスの詳細についてはこちらをご覧ください。ただし、intervalで登録しても意味がないので、tiapp.xmlは

<services>
  <service url="service.js" />
</services>

のように記述します。また、Androidのパーミッションの設定も忘れないようにしてください。以下2行を追記する必要があります。

  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

Titanium + VMware(Android x86)でAndroidアプリ開発

そう、さっきのエントリを読んでお気づきの方もいらっしゃるでしょうが、実はほぼ同じやり方でVMware上のAndroid x86を動作させることも可能です。インストールについてはこちらの記事なんかが参考になるでしょうか。ネットワークの設定はブリッジで追加のデバイスとすれば

$ adb connect 192.168.1.5 #VMware上のAndroidのIPアドレス(例)
$ adb devices
List of devices attached 
emulator-5554	device
192.168.1.5:5555	device

こんな感じで認識します。CLIからのビルドとインストールはこんな感じ(デバイスの指定は例です):

titanium build --platform=android --build-only && \
adb -s 192.168.1.5:5555 install -r build/android/bin/app.apk

androx86

こっちはActionBarに対応していましたね。

もちろん、Androidのエミュレータでx86のイメージを使ってもいいんですが、あれっていまいち不安定でちゃんと動かなかったりすることが多くないですか?原因の切り分けが難しい割に再現する頻度は高いので、最近ちょっとくじけています。

Titanium + BlueStacksでAndroid開発

Androidのエミュレータの動作の遅さには困ったものがあります。ホストと異なるアーキテクシャのマシンをエミュレートするのですから遅いのは当然のことではありますが、開発の意欲を削ぐほどのノロさなので、いくらなんでも限界というものがあります。そういう場合、普通は(1)諦める(2)報復を仄めかす(3)工夫するといった選択肢が考えられますが、われわれ歌と踊りが大好きな愉快で楽しいTitaniumユーザーとしては、3の路線でいきたいものです。

というわけで、先日発表されて話題になった、WindowsやMac OS上でAndroidのアプリが実行できる環境を提供するBlueStacksを使ってみました。BlueStacksのインストールは簡単で、Mac OS Xならダウンロードしたファイルを展開してコピーするだけです。さっそく起動してみましょう。

bs

なんかそれっぽい画面が出てきましたね。さっそくゲームとかいろいろやってみたいところですが、いったん我慢して、Titaniumで作成したAndroidアプリをインストールできるようにします。ターミナルからadbをリロードしてみましょう。

$ adb kill-server
$ adb start-server

おそらくこれだけでBlueStacksがエミュレータとして認識されるはずです。されていなければ、ここだけの話ですが、localhostの10000とか10001とか10002、あるいは5550から順番にconnectを試したら繋がります。

$ adb connect localhost:1000x
$ adb connect localhost:555x

ひどい話ですね。

$ adb devices
List of devices attached 
emulator-5554	device

こんな風に表示されたらしめたものです。あとはTitaniumがエミュレータとして認識してくれれば楽なのですが、面倒くさい+CLIしか使わないので「build-onlyでapkファイルだけ作成」したら「adbでインストール」という手順でやってしまうことにしました。プロジェクトのディレクトリから

$ titanium build --platform=android --build-only && \
adb -s emulator-5554 install -r build/android/bin/app.apk

これで、apkファイルを作成し、インストールするはずです。さっそく実行します。ところが…

なぜだ…

なぜだ…

あれーっ!エラーがいっぱい!そう、実は3.0.2.GA時点でAndroidはbuild-onlyオプションが正しく動作しないのです。仕方がないので対応させてみましょう。$HOME/Library/Application\ Support/Titanium/mobilesdk/osx/3.0.2.GA/android/cli/commands/_build.jsを編集します。

$ diff /tmp/_build.js /tmp/_build_old.js 
404,405d403
<       } else if (cli.argv['build-only']){
<         return;

うーん、問題なければPull Requestしようかな。これでbuild-onlyを無視しなくなります。もう一度さっきのコマンドを実行してみます。

$ titanium build --platform=android --build-only && \
adb -s emulator-5554 install -r build/android/bin/app.apk

BlueStacksには普通のAndroidデバイスにあるようなアプリ一覧みたいなメニューがないので、ホーム画面左側の大きな「My Apps」ボタンをクリックします。

bs2

インストールされていましたね(画像のActionBar2っていうのがそうです。ええ、ついうっかりFruit Ninja Freeも入れましたとも)。ActionBarの動作を試したかったのですが、どうやら対応していないみたい。

bs3

Android実機上でのデバッグ

Androidもやりましたよ。

原文:http://docs.appcelerator.com/titanium/latest/#!/guide/Debugging_on_Android_Devices

====================================================

Android実機上でのデバッグ

【はじめに】

Titanium SDK 3.0から、Titanium Studioを利用してAndroid実機上でデバッグセッションを開始することができるようになりました。Android実機でのデバッグは以下のステップで実行できます:

  • 「Debug on Android Device」を選択する
  • Stuidoでアプリをビルドする
  • アプリを自動または手動で実機に同期する
  • アプリを実機上で起動する
  • LANのWifiを経由してStudioとデバッグセッションを開始する

本項ではこれらのステップとデバッグセッションの起動について解説します。

事前に「Deploying to Android devices」で解説されているようにAndroid実機でアプリを実行できるようにセットアップしておく必要があります。

【必要なもの】

デバッグセッションを実行するために必要なのは:

  • Titanium SDKリリース3.0以降
  • Titanium Studioリリース3.0以降
  • USBケーブルでマシンに接続されたAndroid実機

【デバッグセッションの起動】

デバッグを開始する前に、AndroidをターゲットにしたTitaniumのプロジェクトを作成しておく必要があります。基本的には次の2つのステップがあります:

  1. Titanium Studioでデバッグ用セッションを初期化する
  2. 実機でアプリを実行してデバッグを開始する

デバッグ用セッションの開始

  1. Titanium StudioのApp ExplorerまたはProject Explorerビューからプロジェクトを選択
  2. ツールバーのDebugアイコンをクリック
  3. 「Android Device」を選択して「Debug on ANdroid Device」プログレスダイアログを開く
  4. Titanium Studioでアプリをビルドして実機にインストール

作成したアプリでデバッグ用のセッションを開始すると、Titanium Studioは起動設定を作成し、Titanium Android Device – <アプリ名>として保存します。この起動設定をDebugのドロップダウンメニューから選択するとウィザードをスキップして同じ設定の新しいデバッグ用セッションを開始することができます。

アプリのSDKバージョンの指定を変更する場合は:

  1. Debug > Debug Configurationをクリック
  2. 起動時の設定を選択し、Applyをクリックして変更内容を保存するか、Debugをクリックして変更内容を保存した上でデバッグ用セッションを開始

【アプリの起動とデバッグ】

アプリのインストールが完了したら:

  1. 実機上でアプリを実行
  2. Titanium Studioに実機が接続されてデバッグ用セッションが開始(して、Titanium StudioのDebugパースペクティブが表示される)

【関連トピック】