終:どこまでショボいアプリがAppleの審査に通るのか試してみた の記事の補足記事です。
記事中で開発した「二つ名オンライン(以下、FNO)」はFirebaseを利用して作っています。
クライアントはXamarinで作り、サーバーサイドはFirebaseで作りました。
ちなみにリリース時点ではSparkプラン(無料)です。
使ってるサービスと用途
- FireStore
-
データの保存。二つ名の保存、戦う相手のマッチングと結果の書き込み等々、全部クライアントでやってます。
データ保存時の統合モードがどれだけコンフリクトを回避できるのかなと思って試してみましたが、同じフィールドに同時に書き込みすると当然ですが後勝ちで上書きされる気がします。トランザクションを使って、競合時の処理をそこに書けば回避できる気がします。
ちなみにオフライン動作もONにしてるので、アプリが起動していれば機内モードにしても継続して動作します。機内モードをOFFにすると割とすぐに更新かかりました。 -
Functions -
FireStoreを監視して、戦い終了後にCloud Messagingで相手に通知を飛ばします。
データのお掃除バッチもFunctionsに書いて、Google App Scriptから定期的に呼んでます。GCPには Cloud Schedulerというサービスもあるようですが(執筆時点ではベータ版)、今回は厳しい要件ないのでGoogle App Scriptでやってます。
一番の懸念はSparkプランでは4万秒/月という制約に対し、1回のCloud MessagingにFunctionsが5秒ぐらいかかること。計算すると1日あたり300回も通知を飛ばせない。Sparkプランでは私の個人アプリですら限界を迎えると想像してます。。。 -
Cloud Messaging -
戦い終了後にCloud Messagingで相手に通知を飛ばします。
前述の通り、Functionsから飛ばしてます。最初全くドキュメント読まずに実装して、APNsのデバイストークンで良いと思い込んでてハマりました。FCMのトークンでラップする感じなんですね。 -
- Remote Config
-
主にゲームバランスに関わるパラメータを保存してます。
FireStoreでも良いのですが、SparkプランなのでFireStoreの呼び出し回数を節約したくてこちらを使ってます。Remote ConfigはSparkプランでも無制限です。
-
- Analytics
-
利用状況把握が目的ですが、本当にやりたかったのはIn-App Messageとの連携。
さあ実装してみようとしたところ、Xamarin向けのIn-App Messageのライブラリがまだなかったので断念・・・
何かを達成したらメッセージを表示するとか、FNOのLINEスタンプを作ったらお知らせを出すとか、やりたかった・・・ -
Authentication -
FireStore操作のために認証してます。
と言っても、各アプリ利用者ごとにユーザーを作るわけではなく事前に1アカウントだけ登録して、全員そのアカウントを通してアクセスしてます。
細かい説明は省きますが、実装は公開してるので気になる方は見てみてください。
決して実装に自信があるわけではないですが何かの参考になればと。
→ https://github.com/uemegu/FNO
FireStore:この辺で実装してます
Functions:GitHubには入れてません
Cloud Messaging:この辺で実装してます
Remote Config:この辺で実装してます
Authentication:ここで実装してます
もちろんFirebaseアカウント周りとかは消してますが、オフラインで動作する状態にはしてます。
なぜ、Firebase
Firebaseを採用した理由はFireStoreがあるからでした。
リアルタイムでデータ反映したい、でもサーバーの実装なんて絶対にやりたくない。
AWSのAppSyncは仕事で使ったことあるけど、他はどうかなとAzureとGoogleを調べる。
Azureだとドキュメント見た感じ、SignalR Service が近いのかなと思ったのですがクライアントだけの実装では無理そう。
GoogleのFirebaseにはFireStoreがあり、しかも結構無料枠が大きい。
ということでFireStoreを採用してみましたが、感想としてはかなり手軽。
レコードのインサート時に勝手にID発行してくれるのも嬉しかった。
ただ、あまりに手軽すぎるので、うっかりするとセキュリティやばそう。
AppSyncもそうですが「認証漏れたら何でもできまっせ」という作りになってるとヤバみ。
まとめ
Firebaseを商用利用されてる方はたくさんいると思いますが、無料枠が大きいので個人でちょろっと遊ぶ分にも最高でした。
当初はFireStore以外は特に使うつもりなかったのですが、プッシュ通知もやってみたくなってFunctionsを試したら楽しくなって、なるべく多くのサービス使おうと試してみてました。
どれもサクサク導入できて非常に楽でした。
アプリを運用してみて何か発見があればまた追記します。
追記:2019年4月16日
FunctionsでCloud Messagingを送るのに5秒ぐらいかかると書いてましたが、今ログを見ると500msec程度になってました。見間違えてたってことはないと思うのですが・・・