NITechSearch:名工大の講義室使用状況検索アプリ
はじめに
このページでは、2024年8月~9月に制作を行い、同年10月に学内向けにGoogle Playにてリリースした「NITechSearch:名工大の講義室使用状況検索アプリ」の紹介を行います。
制作したアプリについて
内容

使用技術
このアプリはKotlinを用いたAndroidアプリとして開発し、UIにはJetpack ComposeとMaterial Design 3を採用しました。取得した講義室予約情報はRoomで端末内に保存し、設定値はDataStore Preferencesで管理しています。また、学内システムへのログインに必要な認証情報は、Google Crypto Tinkを用いて保存時に暗号化しています。
通信処理にはRetrofitを、学内システムから取得したHTMLの解析にはJsoupを利用しました。依存性注入にはDagger Hiltを採用し、画面・データ保存・通信処理の責務を分けながら実装しています。
リリース後の品質改善ではFirebase CrashlyticsとAndroid Vitalsを活用し、ユーザー環境で発生したクラッシュを確認しながら安定性の改善を行いました。さらに、GitHub ActionsとGoogle Play Developer APIを用いてAABファイルのビルドからGoogle Playへのデプロイまでを自動化し、公開作業の効率化にも取り組みました。
動機
筆者は以前から「学内システムの情報を使って何かできないかなあ...?」と考えていました. ちょうどその時、SNSで弊学学生による以下のような投稿を見かけました. なお、以下の文章は原文から一部改変したものとなります.
今どの教室があいてるかリアルタイムで知ることができたらなあ...?
この投稿からアイデアをもらい、前述したようなアプリを制作しました. また、同期からも「毎回ログインしないと空室状況を確認できないのが面倒」という声を聞いており、単なる技術検証ではなく、身近な利用者の不便を解消するためのプロダクトとして開発することを意識しました。
制作過程について
筆者はUIをある程度まで問題なく完成させることができました。 しかし、ここでこのアプリを制作する過程で避けられない最大の問題が浮上しました。 それは、
「どのようにして空室状況を取得するのか」
という問題です. 今空いている講義室を判定するためには少なくとも現在の講義室の予約情報を手に入れなければなりません. しかし、講義室の予約情報を取得するAPIは(筆者の知る限りでは)存在しません. そこで筆者は予約情報の確認ができる学内システムのページからスクレイピングで強引に講義室の予約情報を取得しようと試みました。
スクレイピングを行うにあたって、ここでもう一つの問題が浮上します。 それは「どのようにしてアプリから学内システムの認証を行うか」という問題です。 適切な認証なしでアクセスしようとするとログイン画面へリダイレクトされてしまいます。 この問題を解決するために、認証~学内システムへのログインまでの通信を調べ認証方法に関しての検証を行いました。
検証によって得られたログインまでの詳細を以下の図に示します。 (括弧内のダブルクォーテーションで囲まれた文字列はそれらのメッセージ内での名称を表しています)

これらを踏まえて、RetrofitとJsoupを用いて認証とHTMLの解析を実装しました。
前述したものをすべて実装した後、学内システムにアクセスするための認証情報をユーザーに要求するログイン画面、Tinkを用いて保存時に認証情報を暗号化する機能、Roomを用いて取得した予約情報を内部のDBに保存する機能を実装して、最終的に講義室の予約情報を取得する処理は以下のフローチャートのようになりました。

こうして取得した予約情報を端末内に保存することで、ユーザーは毎回学内システムにログインし直さなくても、保存済みの予約状況をもとに空室情報を確認できるようになりました。実装にあたっては、認証情報を扱うため、利便性だけでなく安全な保存方法にも注意しました。
公開と運用について
完成後はGoogle Playで学内向けに公開しました。公開して終わりではなく、リリース後にCrashlyticsやAndroid Vitalsでクラッシュ情報を確認し、実際のユーザー環境で起きた問題の原因を調査して修正する流れを経験しました。
また、GitHub Actionsによる本番環境へのデプロイ自動化も導入しました。以前のアプリ開発では手作業で行っていた工程を自動化したことで、リリース作業の負担を減らし、修正後に素早く配布できる体制を整えることができました。
さいごに
最後にAndroidアプリを作ってから期間が大きく空いていたため、制作前に現在広く使われるライブラリや実装についての学習を行いました。これらの過程のおかげでブランクを埋められただけではなく、学習後に以前の成果物のコードを見直すことにより 肥大化したMainActivity など、高校生の時に書いたコードの問題点を実感することができました。
UIデザインに関しても、Material Design 3を取り入れたり、学内でよく使われている青色を基調としたデザインを採用するなど、以前のアプリ よりもさらに配慮ができたと感じています。
さらに、アプリをリリース後、実際のユーザー環境で発生した不具合の原因を分析することで、実務に近い経験を積むことができました。
この開発を通じて、利用者の声から課題を見つけ、設計・実装・公開・運用まで一連の流れを経験できました。特に、同期から喜びの声を聞けたことで、プロダクトを実際に届けることの難しさだけでなく、使ってもらえるものを作るやりがいも学ぶことができました。
今後はここからさらに開発を進め、以前のコードを見直すことにより得られた反省点や実務に従事されている先輩から貰ったアドバイスをもとにして自分自身の技術力をさらに向上させていきたいと思います。