40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

TitaniumでAndroid向けのMapModule動作させるのにとても苦労したのでその振り返り

少し前に作ったCraftBeerFanのAndroib版を現在作っておりここ数日お店の情報を地図上で表示させる機能の実装をしています。

f:id:h5y1m141:20131030073027j:plain

Androidでは、MapModuleというのを使えばOKのようで、ドキュメント見る限り簡単そうに見えたのですが、思いのほかドツボにハマッたのでその辺りの経緯とかまとめておきます。

以下長文なので、もしも私と似たような状況に陥ってる方向けにトラブル解決のポイントを先に書いておきます。

Titaniumに限りませんが、Android向けのアプリに書名を行うkeystore は、色々なサイトを見ると

~/.android/debug.keystore

という記述になってるかと思いますが、Titanium使ってアプリをビルドする時に デフォルト で参照してる keystoreの場所は

~/Library/Application Support/Titanium/mobilesdk/osx/SDKのバージョン/android/dev_keystore

なのでその点を確認したほうが良いかと思います


目次

  • 経緯を説明する前に自分の開発環境など
  • 公式ドキュメントを見てよくわからなかったこと
  • SHA1のフィンガープリントに関連するアプリの署名ってそもそも何なのか?
  • 設定は完了してるはずなのにログを見るとAuthentication Failureになっていた原因
  • お世話になった情報源

経緯を説明する前に自分の開発環境など

最近、OS X Mavericks‎ が出ましたが、自分の環境は今の所こんな感じです

この前こんなエントリ書きましたが、Mac OS X 10.8 はインストール完了してるのですが、Titaniumの環境構築完了してないため、いまだにMac OS X 10.7の環境使ってます

アプリの動作確認は、しばらく Genymotion を使っていたのですが、日頃Android使ってないせいか、実際に手で触った時の動きを確認したいことが多いので、最近は実機にapkファイルを転送して確認しています。

付け加えると、TitaniumでiPhoneアプリ開発はそこそこ経験してきたが、Androidは全く初めてで、今回Android向けの開発をしてて、周辺知識、例えば、デバッグのツールのDDMS(Dalvik Debug Monitor Service)の存在とか良く知らなかったので、その辺りの知識もある程度ないと厳しいですね。

公式ドキュメントを見てよくわからなかったこと

公式ドキュメント見る限りでは、以下の作業が必要なように理解しました。

  • Google Maps APIを利用するための事前登録を行う
  • 開発マシン上のAndroid SDK managerを立ち上げて、Google Play services SDK をインストールする
  • Google Maps APIを利用手続き完了したら発行されるAPI Key をtiapp.xml に記述
  • app.jsでは必要なモジュールを require()をする

Web API を利用する時にも、アプリ登録して、API Keyが発行されて・・という流れだし、Google Maps API も同様にすればOKかなと思ってましたし、基本的にはそれでOKです。

ただし、API Key取得時に、SHA1のフィンガープリントを取得する必要があるのですが、このあたりこれまで経験したこと無い作業のためか、若干イメージが掴めず、それが要因でドツボにはまったのかなと思います

SHA1のフィンガープリントに関連するアプリの署名ってそもそも何なのか?

IBMのドキュメントが割りとまとまってかと思います

アプリケーションへの署名

すべての Android アプリケーションには署名が必要です。アプリケーションまたはコードへの署名というのは、指定されたアプリケーションに対し、秘密鍵を使ってデジタル署名するプロセスを指します。このプロセスの目的は以下のとおりです。

・コードの作成者を識別する

・アプリケーションが変更されていないかどうかを検出する

・アプリケーション間の信頼関係を確立する

この信頼関係により、アプリケーション同士がセキュアな方法でコードとデータを共有することができます。

説明硬いですが、「どこの誰が作ったアプリなのかを証明するために、こういうデジタル的に処理された署名が必要」っていうことなんでしょうね。

アプリケーションに署名するためには

  • 秘密鍵と公開鍵のペア、そして関連する公開鍵証明書 (デジタル証明書とも呼ばれます) を生成する必要がある
  • 秘密鍵と公開鍵のペアを生成する方法として、Java Developer Kit (JDK) の keytool を使用すればOK
  • keytool ユーテリティを利用することで非公開鍵を格納するためのキーストアファイル( 拡張子keystore)が生成される

という感じのようです。

この辺り下調べせず適当に keytoolkeystore という単語でググって見つけたページの情報を断片的に理解して、全体像がよくわからないまま作業を進めてしまったためにドツボにハマッたのかもしれませんね。

で、SHA1のフィンガープリントっていうのはkeytoolを使って生成された 非公開鍵の情報をSHA1という方式を使ってハッシュ値を得たものっていうことのようですね。

こうやって文書まとめて気づいたのですが、手順が異なるけどiOSアプリ開発で実施するProvisioning Profile 生成と概念は同じなんでしょうね。

設定は完了してるはずなのにログを見るとAuthentication Failureになっていた原因

作業自体は上記のアプリの署名に関する所と行ったり来たりしていたのですが、 @sngmr さんがQiitaに投稿したTitanium Android 開発メモの情報を参考に、keystore の生成をして、buildして実機で確認したのですが、地図が白く表示される状態になっていました。

少し前に@yagi_ さんに、Androidデバッグ用のツールのDDMSのことを教えてもらったので

/Applications/android-sdk-mac_x86/tools/ddms

をダブルクリックしてDDMSを起動させて何が起こってるのかログを眺めていると、Googleのサーバーから、Authentication Failureというメッセージが返ってました。

「keytoolつかって、keystore生成し、SHA1のフィンガープリントの情報を登録してるはずなのに何でだろう??」

とこれがわからずに、かなりハマりました。

自分が作ってるアプリのProjectフォルダ直下に、keystore生成したり、ほかのサイトでよく見かける

~/.android/debug.keystore

を生成したり色々試してもダメだったのですが、Titanium でAndroid向けにビルドする際に参照してるkeystoreのデフォルトの場所が

~/Library/Application Support/Titanium/mobilesdk/osx/3.1.2.GA/android/dev_keystore

だったため、自分が作ってるアプリのProjectフォルダ直下や、~/.android/debug.keystoreを生成しても意味がなかったんですね。。

この辺りの理解が今はできて、おかげさまで意図した通りにアプリ上で地図が表示されるようになりました。

お世話になった情報源

今回、以下情報がとても参考になりました