読書メーターのAndroidアプリを勝手に作ってたら公式がリリースされた話

この記事はeureka Native Engineer Advent Calendar 2017の17日目の記事です。
 
16日目は丹さんによるPairs JP – iOSでプロフィール項目のViewModelをプロトコルで上手く書いている話でした。

はじめに

こんにちは!こんにちは!こんにちは!エンジニアの二川(@futabooo)です。
今年のAdvent Calendarでは3回目の登場です!
過去2回の記事もぜひご覧ください(^o^)
 
Pairs Android JPにおけるさがす画面のレイアウトの実現方法について
 
社内Tinder風Webアプリ「Maybee」を会社忘年会のイベント用に作った話
 
さて今回は今年個人で開発してリリースしたAndroidアプリの話を書きたいと思います。
タイトルにもある通り、読書メーターという既存の読書管理WebサービスのAndroidアプリを勝手に作った話です。
アプリの構成や勝手に既存Webサービスのアプリを作るのに使ったツール群、開発のモチベーションなどについて紹介していきます。

読書メーターとは

読書メーターは株式会社トリスタが運営する読書家向けのWebサービスです。
読んだページ数や冊数などの読書量をグラフにして読書記録したり、日本中の読書家さんたちとコミュニケーションができるサービスです。
さらに詳しい紹介はこちらのページをご覧ください 読書メーターとは?

非公式Androidアプリを作ろうと思った理由

読書メーターの非公式Androidアプリを作ろうと思ったのは、僕自身の2017年の目標に読書年間40冊をかかげたことがきっかけです。
もともと読書の習慣がなかったので何か記録をつけるサービスを使うことで習慣化をしたいと考え、いくつか既存の読書管理サービスを調べました。
普段使っている携帯電話がAndroidなので、Androidアプリがあるものを探していたのですがなかなか自分の望む要件と一致するものが見つかりませんでした。
そんな中読書メーターは公式のAndroidアプリが無い(2017年1月頃)ことを除けば要件を満たしていたので、どうせなら自分でAndroidアプリを作ってしまおう!というところからアプリ開発を始めました。

とにかくリリースを早くしたい

まずコードを書き始める前に初期リリースまでにやること・やらないことを決めました。
Web版の読書メーターには豊富な機能があり、すべてを提供できるところまで機能を作り込むと時間がかかります。最初にリリースするまでをとにかく早くやりたかったので最小限の機能に絞る必要がありました。
 
最初のリリースをとにかく早くやりたかった理由は競合の存在です。
読書メーターには公式のAndroidアプリはありませんでしたが、唯一WebViewを使ったガワアプリをリリースしている人がいました。さらにそのガワアプリはGooglePlayStoreで確認する限り既に1万〜5万ダウンロードされており個人開発アプリとしてはかなりの数をほこっており、すごい!と思いました。
しかしそのガワアプリは読書メーター側の仕様変更によってログイン周りに問題が発生していたので、今なら勝てるのではないか、このユーザー数をまるっと奪えるのではないかと考えました。
 
とにかく早くリリースする上で、僕がやりたかった読み終わった本を手間なく、読んだ感想とともにサクッと記録できることができるようになる最小限の機能までを作りきりそれ以外の機能はリリースしたあとに考えるということにしました。

開発開始からリリースまで

開発は比較的順調にすすんでいました。
しかし5月のGWが過ぎた頃に、僕が作っていたアプリでもログインができない事象にみまわれました。アプリ開発終了の危機か?とも思いましたがここで諦めるわけにはいきません。アプリを作ろうと思った最初の頃にはなかったのですが、いい感じにアプリが作れたら、ワンチャン読書メーターの運営会社さんに買っていただけるのでは!みたいな気持ちが芽生えていたからです(^q^)
 
あとで書いていますが、開発で使っていた各種ツール群を駆使してなんとかログインできるように修正しました。
 
リリースにあたっては今後の機能開発にするためにいくつかのアクションのログを取得するようにしていました。具体的には本を登録する際に、キーボード入力・音声入力・バーコードスキャンからの入力のボタンを用意し、それぞれがどれ位押されるのかを取得していました。
音声入力についてはボタンを押すと開発中(´・ω・`)という表示をするだけのもの、バーコードスキャンは有名所の読み込みアプリへのIntent発行のみでインストールされていない場合はGooglePlayStoreを開くようにしたものです。
 
本の登録をサクッと簡単にやるうえで、入力をどうするかは最初にやりたい機能追加だったのでここにログを仕込んでいました。

リリース後のアクシデント

社内の数人にお願いをしてデバッグに協力してもらったすえ、9月にやっとリリースすることができました。とにかく早くとはなんだったのかという気持ちですが、リリースまでいけたことは達成感がありました。
 
しかし本当の戦いはここからでした。
リリースしてみると、特定のOSのバージョンで起動時に必ず落ちる問題が発生していました。ログインのID/PASSの保存時に暗号化していたのですが、その周りで落ちていたようです。
最終的に使っていた暗号化のライブラリへPullRequestを出し、無事マージしていただくことで解決することができました。
 
他にも一度登録した本の感想を編集できないというレビューコメントや、もっとこんな機能をつけてほしいというコメントもいただきました。業務でのプロダクト開発でも言えることですが、ご要望についても優先順位をしっかり見据えて取り組んでいくことが個人アプリ開発を続けていく上でも大事なことだと感じています。

突然の公式のAndroidアプリリリース

ドワンゴ、書評サイト「読書メーター」のiOS/Android対応アプリを提供開始 | 日本経済新聞
\(^o^)/
 
10月末に公式のAndroidアプリとiOSアプリのアップデートが行われました。
もともと読書管理をする上でAndroidアプリが欲しかった僕にとってはこのリリースによって個人アプリ開発のモチベーションが一気に下がってしまいました。特にワンチャン!!がなくなったのが最大の痛手です。
 
それでもまだ僕のアプリを使ってくれてる人がDAUで30人ぐらいいたり、Dailyの新規インストールが数件あったりするので可能なメンテはつづけて行きたいと思っています。

読書メーターの非公式Androidアプリ「BookLife」の構成

ここからはtech blogらしく作ったアプリの技術的な話を少し紹介します。

パッケージ構成

パッケージ構成の一部を抜粋しました。
個人的に試してみたかった画面ごとにパッケージを区切って必要なクラス群をまとめる構成をやってみています。
必要なクラスが同じパッケージに入っていることでわかりやすい部分もあるのですが、共通で使われるような部分をどうするか?というところへの解はまだ得られていないと行った状況です。commonみたいなパッケージを切るのも雑すぎるよなーという感じです。
また全体としてはMVP+DataBindingで作っていました。

booklife
├── BookLife.kt
├── CrashReportingTree.kt
├── HostSelectionInterceptor.kt
├── InfiniteScrollListener.kt
├── LoggingInterceptor.kt
├── MainBottomMenu.kt
├── di
│   ├── components
│   └── modules
├── extensions
├── model
└── screen
    ├── addbook
    ├── bookdetail
    ├── booklist
    ├── home
    ├── licenses
    ├── login
    ├── option
    ├── search
    └── splash
        ├── SplashActivity.kt
        ├── SplashPresenter.kt
        └── SplashService.kt

お世話になったライブラリー

下記のライブラリーを使用しています。
だいたいが現状のAndroidアプリ開発ではデファクトとなっているものだと思います。
今回のアプリ開発ではjsoupに大変お世話になりました。

開発で使ったツールたち

開発を進めるにあたって下記のツールを駆使していました。

APIが提供されているわけではないWebサービスのAndroidアプリを作るのに上記のツールは欠かせませんでした。

おわりに

既存のWebサービスのAndroidアプリを勝手に作った話を紹介しました。
日本だとどうしてもiPhoneの方がユーザーが多いためにAndroidアプリが無いか、遅れてリリースされるサービスが多いように感じています。
自分が気に入って使いたいと思ってもAndroidアプリが無くて諦める、みたいなことが今後は無くなる!かもしれませんね!(ただいつ公式が出してくるかわかりません\(^o^)/)
 
また今回作ったアプリは、公式からAndroidアプリがリリースされたタイミングでプロジェクトを公開したので、詳細を見たい場合はこちらを見ていただけると幸いです。
 
futabooo/BookLife
 
明日はインターンの鈴木くんです。CoordinatorLayoutで作るマテリアルデザインとカスタム方法の基礎というタイトルで書いてくれるそうなので楽しみです!

  • このエントリーをはてなブックマークに追加

エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!

Recommend

iOSDC 2017にエウレカから3名が登壇してきました #iosdc

Carthageのcopy-frameworkをスキップして開発時のビルドを高速化する