kazakago’s LGTM

個人的な書き物置き場

AniStackというアニメ視聴管理アプリを作った話

友人と2人でAniStackというアニメ視聴管理アプリを作ったので忘れないうちにやったことを書き留めておこうかと思います。
よければダウンロードしてね!

作ったもの

f:id:kazakago:20180707194803j:plainf:id:kazakago:20180707194527j:plainf:id:kazakago:20180707194555j:plainf:id:kazakago:20180707194757p:plain

iOS

AniStack

AniStack

  • Kensuke Tamura
  • エンターテインメント
  • 無料

Android

play.google.com

きっかけ

エンジニアの友人である @alumys となんかアプリ作りたいよねって話をしていて、お互いアニメ好きだったので視聴管理できるアプリ作ろうという話から生まれました。

Annict

Annictというアニメ視聴管理サービスがあるのですが、そちらではAPIを公開されており、なおかつオフィシャルのクライアントアプリもなかったのでちょうどよさそうという話になりました。
(有志でクライアントアプリを作っている先人の方は何名かおりましたが)

なんとこのサイト、@shimbacoさんという方が個人で運営しているとのこと。このクオリティは素晴らしいの一言に尽きます。
私もユーザーで楽しく使わせて頂いているのでこの場で感謝申し上げます。

技術的なこと

担当割り振り

お互いAndroid/iOSどちらも書けるのですが相談の上、自分がiOS担当、@alumysAndroid担当で実装しました。
またアイコンやロゴについてはデザイナーの方にも協力頂いています。

iOSはリリースを維持するのに毎年お布施が必要なので、新規アカウントを作らず元々持っていた自分名義のアカウントですべてリリースしています。

ツール

お互い別の会社に勤めているため、効率的に作業を進める必要がありいくつかのツールに頼りました。
オープンソースではないためクローズドに扱えるツールを中心に使いました。

ちなみに個人プロダクトであってもCIで自動的にDeploygateデプロイ+Slack通知を組むとめちゃんこ便利です。

言語

f:id:kazakago:20180707200633p:plainf:id:kazakago:20180707200646p:plain

どちらもネイティブで書いており、iOSはフルSwift・AndroidはフルKotlinで書いています。
あとはアーキテクチャやクラス設計、画面仕様だけ合わせてそれぞれで実装しています。

アーキテクチャ

アーキテクチャはお互い業務でも使っているCleanArchitecture + MVPで実装しています。 RxとDIツールを組み合わせて使っています

https://github.com/android10/Sample-Data/blob/master/Android-CleanArchitecture/clean_architecture.png?raw=true

ぶっちゃけ個人規模であればMVCで雑に作るのが最速かつ問題もそこまで起きないと思いますが、仕事だとやるのが難しいガチガチの設計で組みたいよねという話になりました。

画面設計

各OSで用意されているプレーンなコンポーネントを中心にシンプルな画面設計にしています。

最初JustInMindを使ってプロトタイプを組もうと思ったのですが、高機能すぎてワイヤーだけサクッと作るというのが逆に難しく、結局紙に書いてそれを直接実装しました。

この辺はAndroidiOSコンポーネントを把握しているエンジニア同士だからこそ、雑な画面設計から実装のイメージが付く部分なのかなとも思ったりします。

ただ、両OSの基本デザインを崩さないようには注意しました。(iOSAndroidアプリにしないとか)

アイコン・ロゴ

f:id:kazakago:20180707195635p:plain

アイコンやストアロゴなどのは流石に自前で用意できなかったので、会社のデザイナーさんに依頼して作ってもらいました。(もちろん有料でw)

ちなみにAndroidのアイコンはAdaptive-Iconに対応しています。
個人アプリでAdaptive-Iconに対応してるアプリは少ないのではないでしょうか。
細かいところに気を使ってくれるデザイナーさんには頭が上がりません。

こういうとき繋がりがあると非常に助かりますね。

UI/UX実装

UXを組むときに特に注意したのは、ユーザーの操作をなるだけ妨害せずに通信中かどうかを示す部分です。

ログイン中などはProgressHUDを表示して操作できないようにしていますが、その他非同期で取得できるものは画面上に通信中の表示を出しつつ、ユーザーの操作を邪魔しないような配慮をしています。
たとえば以下の作品詳細画面は、画面下部の視聴ステータスを非同期で取得しています。
変更時も非同期で情報の送信を行い読み込み中のストレスを最大限抑えています。

f:id:kazakago:20180707233307g:plain

また作品一覧画面では下まで読み込んだときにページング処理を行っていますが、読み込みに失敗した際は最後のセルにエラーの表示を出しています。
さらに再試行ボタンを押した場合にはその部分から再試行を行い、ロード済みの情報を失わずにシームレスに復帰できるよう実装をしました。

f:id:kazakago:20180707233436g:plain

リリースしてみて

自分自身すでにOSを変えながら何度かソフトやアプリをリリースしていますが、やはりいちばん大変なのが8割方作った後の作業だったりします。

なにかを出したことがある方ならよくおわかりだと思いますが、最後の詰めが一番めんどくさく手間がかかります。
アプリの場合はUIの細かい微調整や使い勝手の向上、ストア情報の準備や利用規約の用意、このあたりをいかに手を止めずに進められるかが個人でプロダクトをリリースするための肝になるかなぁと感じています。

今後

現在は別のプロダクトに着手しているためAniStackについては直近で大きなアップデートは予定していません。
ただ本家AnnictのWebサイトより(APIが提供されておらず)機能的が劣る部分があるため、もし今後APIが拡充された場合は追従して機能追加していきたいと考えています。