スマホアプリ開発のブログ

【障害】ローカルストレージの会員認証データが消えた【ごめんなさい】

こんにちは、オサムです。

 

公開しているアプリで、かなり致命的なバグを出してしまいました。

 

アプリの不具合でローカルストレージの会員認証データが消えてしまい、スタンプカードの情報が表示されなくなったのです。

 

被害を受けた方、ごめんなさい。

 


 

1.会員認証データが消えたら何がヤバいのか


Stacaでは初回の会員登録時にローカルストレージに認証情報を保存しています。これは次回以降のアプリ起動時に自動ログインできるようにするためです。

 

※ 「そもそもStacaって何?」という方はこちらを先にお読みください

 

ローカルストレージには

 

  • メールアドレス会員の場合は「メールアドレス」と「パスワード」
  • 匿名会員の場合は「ニフクラmobile backend」で生成される認証キー(authData)

 

を保存していました。

 

今回、アプリにバグがあり、ローカルストレージの認証情報が消失してしまったのです。

 

メールアドレス会員の場合は「メールアドレス」と「パスワード」を再入力してもらえればログインできるため、「一度だけ自動ログインができない」というだけでそれほど大きな影響はありませんでした。
ニフクラ mobile backend メールアドレス認証

 

しかし、匿名会員の場合はユーザーには見えないローカルストレージに保存している「認証キー」が消えてしまったので、ログインすることができなくなってしまいました。
ニフクラ mobile backend 匿名認証

 

Stacaにログインできないということは、お客さまがコツコツ貯めたスタンプカードの情報を見ることができなくなるということ。スタンプを貯めることもできなければ、利用できるはずの特典も利用できません。

 

さらにはお店(ショップユーザー)の場合はもっと深刻です。昨日まで見えていたお客様のスタンプカードの一覧が表示されなくなるのです。

 

お客さまがカードを提示しているのに、お店側でスタンプを押せないのです。もちろん、お店側で特典を利用済み状態にすることもできません。

 

お店によっては「スタンプが一杯になったら1000円割引」とか「次回サービス料が無料」といった特典を設けておられます。

 

お店やお客さまにとって、スタンプカードはお金と同じ価値があるということ。それが突然、アプリから消えてなくなるんです。

 

思い出しただけでイヤな汗が出てきました。

 

2.そもそもアプリをアップデートした経緯


2020年11月、monacaからこんなリリースがありました。

 

monaca cordova10サポートの開始

 

cordovaのバージョンアップはとても厄介で、以前、cordova9にバージョンアップしたときも、何もソースを触ってないのにアプリが動かなくなったりしてとても苦労しました。

 

できるだけ先送りにしたかったのですが、実機でテストするツール「monacaデバッガー」が先にバージョンアップされてしまい、cordova9のアプリのデバッグができなくなったんですね、

 

それで仕方なくアプリをcordova10にバージョンアップすることにしました。

 

・・・これが不幸の始まりでした。

 

cordova10にバージョンアップした瞬間、予想通り動かなくなるアプリ。実機でテストしてもスプラッシュスクリーンのまま固まっています。

 

ログを調べてみると、アプリを起動したときに、cordovaプラグインが使える状態になったら呼ばれるはずの「devicereadyメソッド」が呼ばれていない模様。

 

試しに怪しそうなcordovaプラグインをアップデートしてもダメ、消してもダメ。

 

ええい、何が原因か分からないから、いったん全部のcordovaプラグインを外してしまおう!
(今思えばこれが悪かった・・・)

 

しかし、それでもアプリが動くことはありませんでした。

 

かれこれ、1か月以上は調査を続けましたが原因は分からず、「もうこの先アプリをアップデートできないんじゃないか」という状況で途方に暮れていたころ、こんな情報にたどり着きました。

 

【stack overflow】Cordova DeviceReady not firing

 

簡単に言うと、「index.html」に「cordova.js」の読み込みを追加すればいいとのこと。

 

<script src="cordova.js"></script>

 

6年前、しかも「cordova4.1.2」での情報でしたし、「cordova9」ではこの記述がなくても動いてたので、「どうせまた駄目だろうな」と思いながらも試したところ、、、なんと動きました!

 

※ 実際に追加したのはmonacaの環境に合わせたこの1行です

<script src="components/monaca-cordova-loader/cordova-loader.js"></script>

 

「よかった、これでようやくアプリをアップデートできる・・・」

 

ハマっていた期間が長かった分、喜びもひとしおです。

 

調査のために外していたcordovaプラグインをもう一度、全部入れ直して、そそくさとアプリをリリースしました。

 

ひとつだけ、とても重要なcordovaプラグインを入れ忘れたまま。。。

 

3.あれ、バグったかも、と気付いた瞬間


リリース後、少し気になってアプリに入れているcordovaプラグインを確認していたところ、「cordova-plugin-migrate-localstorage」が入ってないことに気づきました。

 

このプラグインは以前、「UIWebView」から「WKWebView」にアップデートするときに、ローカルストレージのデータ移行をするために実装したものです。

 

CordovaのUIWebView→WKWebView移行についてまとめ

 

 

「ん?このプラグインがないとデータ移行前のパスを参照しているんじゃないか?」
「そのパスには認証データはないぞ。。。」

 

ここで、はじめて障害に気づきました。

 

認証データが見れないということは、匿名会員がログインできないということ。
ログインできないということはスタンプカードも見れなくなっているということ。

 

これはヤバい!

 

急いで、プラグインを入れ直して修正版のアプリをリリース。

 

でも不具合のあったバージョンを使っていたユーザーの認証データは既にローカルストレージから消えていたのでした。

 

どうしよう。。。

 

4.予想通り、問い合わせメールが来た・・・


悩んでいるうちにユーザーから続々と問い合わせメールががが。

 

 

会員登録せずに利用してたのですが履歴がきえてるのですがどうしたらいいですか?


 

 

ショップユーザーとして使用しておりましたがログインできなくなりました。
何かログイン方法ありますか?


 

あわわわ、なんとかせねば。

 

でも消えたのはスマホ端末上のローカルストレージのデータなので、こちらからは復旧のしようがありません。

 

さてどうするか。。。

 

一つの妙案が浮かびました。

 

「そうだ! サーバの認証キーをローカルに落としてくればいいんじゃないか」

 

5.ありったけの知恵を絞って復旧にいそしむ


「ニフクラmobile backend」の会員データには「userName」と認証キー「authData」が保存されています。

 

「userName」はシステムで自動付与されるユニークかつランダムな文字列です。

 

なので、

 

  • 問い合わせのあったユーザーに「userName」をお知らせする。
  • ユーザーに「userName」を入力してもらって、サーバから認証データ「authData」を引っ張ってきてローカルストレージに保存し直す

 

この対応でなんとかなりそうです。

 

早速、アプリにデータ復旧専用の画面を作って即日リリース。その後は問い合わせメールが来るたびに、データ復旧の案内をする日々が続きました。

 

最終的には、復旧対応も10件程度で済み、障害は無事に収束したのでした。

 

6.教訓


アプリをアップデートする際の検証は入念に実施すること。

 

今回はcordova10のバージョンアップ対応が解決して安心していた、ということも一因ではありますが、アプリを更新したときの確認が不十分なままリリースしたのが良くなかったですね。

 

障害に気づいてからは、生きた心地がしませんでしたが、ユーザー様への影響は最小限で済んでよかったと思います。

 

最後に、データ復旧の案内をしたユーザー様からは、

 

 

スタンプカードが見れるようになりました。ありがとうございました!


 

 

ログインできました。助かりました。復旧ありがとうございます。


 

という、暖かいメッセージをいただきました。

 

アプリの不具合が原因なのに、申し訳ない気持ちでいっぱいです。
ご迷惑をかけた方、ごめんなさい。

 

今後はバグを出さないよう、くれぐれも気をつけます!

 

 

PR




PR


HOME スマホアプリ開発ブログ SE入門講座 無料スクールまとめ フリーSE案件サイト SEおすすめ書籍