チンチラのフンみたいなもの

毎日の学んだことを書いていきます

アプリリリースしました!!!!④(最終回)

前回 

アプリに使った技術 Firebase編

Firebaseを採用した理由

 アプリの認証機能、DBにはFirebaseを使っています。認証機能を付ける必要があるのは、データをユーザーごとに切り分ける必要があるからです。Firebaseはクラウドサービスです。DBからデータを全て持ってこようとすると全てのユーザーが記録した訪問情報を表示することになるので、ユーザー認証して、そのユーザーのデータのみ持ってくる必要があります。クラウドサービスではなく、Realmのようなローカルに保存するDBを使えばローカル内でしかデータのやり取りをしないので認証機能を付ける必要がありません。そうすればユーザーも少しめんどくさいメールアドレスやパスワードの入力もしなくて済みます。
 今回わざわざクラウドサービスを使ったのには2点理由があります。まず1点目はアプリをアンインストールでデータが消えるようにはしたくなかったからです。ローカルDBはアプリをアンインストールするとデータが消えます。仕事で使うことをイメージしたアプリなので、仕事の大事なデータが簡単に消えてしまうのはよくないと考えました。2点目は今後の機能追加を見越してのことです。当初のアプリのイメージは記録と共有ができるというものでした。共有機能があれば仲間内での記録のやり取りができるので、チームのその日のノルマまであとどれくらい必要かがリアルタイムで把握でき、日報提出や引き継ぎにも役立ちます。この機能の実装は難易度が高く、パッとできるものではないので「Done is better than perfect」の精神で今回は見送らせて頂きました。以上2点の理由からFirebaseを採用させて頂きました。

工夫した点

 Firebaseの使用にはお金が掛かります。と言っても無料枠があり、1日5万件の読み取り、2万件の書き込み、2万件の削除までは無料で使えます。なのでよっぽどアプリが流行らない限りはお金は掛からないと言っていいでしょう。しかし、アプリが流行らなくてもお金が掛かってしまうことがあります。「クラウド破産」です。クラウド破産とはクラウドサービスの料金が意図せず高額になることです。詳しくは記事を読んで欲しいのですが、主にアプリの設計ミスや公開してはいけない情報が漏れてしまったことが原因で起こるようです。私はこのことにかなりビビりました。なんせアプリが流行ったわけでもないのに、数十万、数百万の請求が突然くるのですからたまったものではありません。Googleに事情を話せば返金してくれることもあるようですが、できるだけそんな面倒ごとは避けたいです。
 そこで私は2点ほど工夫をしました。1点目はprint文を使うことです。読み込み、書き込み、削除をした際には必ず「〇〇データの取得に成功しました」や「〇〇データの削除に成功しました」のような文がコンソールに出力されます。これにより設計ミスにより必要もなく何度もデータを取得等していたら、コンソールに文が何度も表示されるのですぐに気づきます。また「セールスマップ」の場合GoogleMapsも使っているので、住所を取得する際にはそれもprint文で表示するようにしています。
 2点目はFirebaseとのやり取りそのものを少なくすることです。Firebaseを使っている記事を見るとよくviewWillAppearにデータを取得するメソッドを使っているのですが、私はそんなことはしません。確かにそうすれば簡単に最新のデータを表示することができます。しかしこれは、毎回全てのデータを取得することになるので無駄が多いです。そこでスナップショットリスナーを使います。スナップショットリスナーを使えばデータの変更を感知し、その変更後のデータのみを取得することができます。これにより例えばrecordDataを元にテーブルを表示していた場合、変更後のデータをrecordDataに入れ、reloadDataすれば、必要最低限のデータのやり取りでテーブルを更新できます。 そしてそれと合わせてNotificationCenterを使うことでさらにやり取りを減らします。NotificationCenterを使えば画面遷移が伴わなくても異なるviewController間でデータの受け渡しができます。これによりスナップショットリスナーで取得したデータを他のviewControllerに渡すことができるので、スナップショットリスナーをviewControllerごとにつけて無駄に取得するということがなくなります。以上2点が私がクラウド破産を避けるため工夫したことです。

課題

 アプリをインストールして、最初に得られるユーザー体験にあるストレスをできる限り減らすことが一番の課題だと感じています。個人アプリなので、最初でちょっとでも嫌なことがあるとユーザーはそれ以後使ってくれないように思います。最初のインストール後の一番のストレスはやはりユーザー登録でしょう。面倒だし、個人情報を渡すし渡すし、できればやりたくありません。この点でログイン機能を付けるべきか少し悩んだのですが、調べるとFirebaseでゲストログイン機能を実装できるのですね!凄い!今現状のデータだと仕事で使ってくれてる人がいないので当然といえば当然なのですが、10個データを記録した人はいません。なので10個まではゲストでも記録できるけど、それ以降はユーザー登録してねという形に変えたいと思います。10個ならアンインストールしてデータが無くなってもそれほど問題はないでしょうし。「セールスマップ」はポートフォリオも兼ねており、企業さんはユーザー登録とかは避ける傾向にあるので、転職活動中の今このことはできる限り早急に対応したいなと思います。