技術記事については、Qiitaにも稀に投稿しています。

Androidアプリ開発の初心者が東京メトロのアプリコンテストに出場した話 - 設計編 -

metro_apps3

東京メトロ主催のオープンデータ活用コンテストに参加することになり、大学の後輩と会社の同期の3人でチームを結成。Androidアプリの開発を行うべく、開発環境の構築まで完了しました。

“Androidアプリ開発の初心者が東京メトロのアプリコンテストに出場した話 - 準備編 -”の続きです。

設計

要件定義書

まずは話し合った内容を基に、簡単な仕様書を作成。今回は機能的な規模は小さかったし、期間も長くないので、そこまで詳細なものを書かずとも認識の共有は十分でした。が、一応作ってみました。

requirement

DB設計書(&DDL)

これは作成する段階が早すぎたためか、作成したものの詰めが甘かったからか、開発段階で幾度と無く修正することになりました。特に、アプリ内DB(SQLite)と、サーバ側DB(MySQL)の目的に応じた使い分けがブレていたかな、と。

ちなみに、今回学んだことのひとつとして、アプリ内DBに蓄積したデータの可視方法があります。これは 後ほど。

処理フロー設計

アプリの特徴として、2名以上のユーザ間での通知機能を実装する必要があったため、どうやって実現できるのか、というブラックボックスだった部分を調査し、整理のためにも処理フローを書いてみました。

flow

また、これも今回学んだことなのだけど、この通知を実現するために使ったのが、Googleが提供しているGCM(Google Cloud Messaging)というサービスです。

初めてGCMを用いた通知に成功した時の画面はこんな感じでした。いわゆるノーティフィケーションと呼ばれるやつです。

gcm

画面設計

ここは主にディレクター(兼デザイナー)さんががんばってくれた箇所になります。ページフローとなる遷移図に、それを画面に落としたワイヤーフレームです。

画面遷移図

画面間の遷移を表現したものです。開発段階でこれが結構役立ったかも。また、これと上の定義書を合わせた形で、画面別の機能一覧も作成しました。

page_flow

ワイヤーフレーム

各画面に対し、ボタン等の必要な要素を盛り込んだ形でのワイヤーフレームです。画面遷移図だけでは開発者との認識ずれが発生してしまう可能性があるので、これも非常に重要な成果物となります。

mockup-Wireframe

開発(基本、API、環境)

必要なドキュメント類を揃え(正確には揃う前)、開発に入りました。本来ならクラス図とかシーケンス図とかを書くべきなのかもしれないけど、なにぶん本格的なスマホアプリ開発は初だったので、まずは手を動かしてみることにしました。

Androidアプリ開発の基本

開発言語はJavaということで確定なのだけど、じゃあFrameworkとかはどうする?いやいや待てよ、それ以前にAndroidアプリの開発ってどこからどう始めるものなの?という知識レベルだったため、おなじみHelloWorldから始めました。

下の画像は最終的なパッケージ構成(ディレクトリ構成)なのだけど、com/railway配下はオリジナリティたっぷりなので見せられない笑

directory

徐々に必要なライブラリだとかを追加していく上に、ソースコードも途中でベターな書き方を知ったりしても序盤に書いた部分は軌道修正が難しく、スパゲッティコードをどんどん生み出してしまうスタイル。

...ということも事前にわかっていたのだけど、知識レベルと期間のバランスを考えると、「やってみてから、考える、詰まったら都度調べる」しかなかったのです。

オープンデータの使い方(API)

準備編にも書いたように、提供されるデータはJSON-LDという形式ですが、これをAPI経由で取得するとはどういうことなのか。

今回提供されたAPIは、HTTPSを使ったRESTful APIでした。つまり、HTTPS通信を用いた特定のURL(エンドポイント)を叩くことで、指定したパラメータに基づく結果を、指定されたデータフォーマット(JSON-LD)で取得できる。

以下は、今回APIのテストで使ったGoogle Chromeの拡張機能で、“Advanced REST Client”というブラウザアプリ。(但し、画像で叩いているAPIはコンテストとは無関係)

advanced_rest

APIの仕様に関する詳細はコンテスト参加者(登録者)にのみ公開されているようだし、使用するにはアクセストークンが必要だし(アプリ応募者以外のトークンは無効化済み)、ここまでとします。

AndroidにおけるJSONの扱い

では、取得したJSON-LDデータをAndroid端末で扱うにはどうすればいいのか。

いろいろ調べてみた結果、Javaの著名なFrameworkを提供しているSpringのProjectsのひとつ、Spring For Androidが使えそうだという情報にたどり着きました。

springForAndroid

個人的には、2年前にアメリカのサンタクララで開催されたSpringOne2013に参加していることもあり、SpringFrameworkには興味があったのでワクワクでした。

ちなみに、そのカンファレンスに関するブログはこちら

Android Studioへの乗り換え

チームのディレクターさんの開発環境がどうにもうまく動かないところがあって、Eclipseを用いた環境構築に四苦八苦していた頃、試しにAndroid Studioの環境を作ってみたらこれが簡単に動いたのです。

AndroidStudio

これは、正式版がリリースされた後の起動画面だけど、コンテスト開催中に用いていたベータ版はもう少しドロイド君推しな感じでした。

ライブラリ管理周り?でエラーが大量に発生していたようだったため、Gradleで管理することで見やすく、分かりやすくなりました。例えばSpring For Androidの場合、以下のようにbuild.gradleファイルに記述しています。

dependencies {
    略
    compile files('libs/spring-android-auth-1.0.1.RELEASE.jar')
    compile files('libs/spring-android-core-1.0.1.RELEASE.jar')
    compile files('libs/spring-android-rest-template-1.0.1.RELEASE.jar')
}

Eclipseからのプロジェクト移行も簡単にできるので、既存プロジェクトの移行もおすすめです。QiitaにEclipseからAndroidStudioへの移行手順まとめという記事があるので参考になりそう。

というわけで-設計編-はここまで。

“開発編”へ続く