現在地共有サービス第2弾を作った。

https://user-images.githubusercontent.com/11763113/37872124-f2a6d84c-303b-11e8-9ce8-319e818eee96.png

 

以前、 imakaraでやりたかったことなど - YusukeIwakiのブログ で作っていたものをベースに、

  • Androidアプリ側はKotlinを使ってみよう
  • サーバーサイドはRailsじゃなくてFirebaseで済ませちゃおう

ということをやってみたく、作ってみた。

github.com

github.com

Firebase Realtime DatabaseとFirebase Functions/Hostingがあれば趣味のアプリは大抵作れてしまう

imakaraでは練習目的でRailsでサーバーサイドを実装していた。サーバーサイドがRailsだと当然、Androidアプリ側も、

  • APIクライアントを実装したり
  • 非同期処理をいい感じにやったり

などなど、わりとお決まりの骨が折れるコードをいっぱい書かないといけなかった。

しかし、今回、Firebase Realtime DB + Firebase Functions/Hosting でやってみて衝撃。APIクライアント(というかHTTPクライアント)を一切使うことなくWebアプリが作れてしまった。 ざっくりどんな構成になってるか説明してみようと思う。

Androidアプリ側でGCMトークンが取得できたタイミングで、FirebaseUserIDに紐づけてDBに保存

f:id:YusukeIwaki:20180326223618p:plain

実装的にはこのへん: imacoco-android/DeviceRegistrationManager.kt at 10d3d22bcba4a71e6dd973d700e70a43e28d8de9 · YusukeIwaki/imacoco-android · GitHub

アプリで「FirebaseUserIDに紐づけてDBに保存」されたのをFirebase Functionsでリモート監視して、そのレコードに共有用URL値を付け加える

f:id:YusukeIwaki:20180326224943p:plain

実装的にはこのへん: imacoco-firebase/index.js at fa330011380bc6047b3c22a11f1a727419ecbb83 · YusukeIwaki/imacoco-firebase · GitHub

Androidアプリ側で、共有URLをリアルタイムに表示する

f:id:YusukeIwaki:20180326225929p:plain

実装的にはこのへん: imacoco-android/OverviewActivity.kt at 10d3d22bcba4a71e6dd973d700e70a43e28d8de9 · YusukeIwaki/imacoco-android · GitHub

共有用URLにアクセスが来たら(中略)測位要求を送る

f:id:YusukeIwaki:20180326231558p:plain

Firebase HostingでGoogleMap1枚ぺらのページを返す。ついでに、Realtime DBの位置情報をリアルタイムにsetCenter。さらについでに、マップのロード時に裏でこっそりFCMプッシュを送ってて、測位して下さいねー!ってAndroidアプリ側に要求がいくようになっている。

実装的にはこのへん: imacoco-firebase/index.html at fa330011380bc6047b3c22a11f1a727419ecbb83 · YusukeIwaki/imacoco-firebase · GitHub

Androidアプリ側でプッシュを受けたら、ワンショット測位して結果をDBに書く

f:id:YusukeIwaki:20180326232403p:plain

実装的にはこのへん: imacoco-android/OneShotPositioningService.kt at 10d3d22bcba4a71e6dd973d700e70a43e28d8de9 · YusukeIwaki/imacoco-android · GitHub

 

 

 


・・・というかんじで、リアルタイムDBに必要な情報は全部載せてしまって、あとはFunctionsでボットスクリプトみたいなのを書いてHostingで入り口を作れば趣味のアプリはできてしまう。

もう趣味でRails書く気は全く無くなってしまった。困った。