前回、機種変更時のデータ引き継ぎ機能について書きました。
今回はその後に見つかった不具合と、直した内容をまとめます。
1. Samsungキーボードで文字が化ける問題
引き継ぎコードの入力欄で、Samsung端末のキーボード(予測変換オン)を使うと、打った文字と違う文字が表示されることがありました。例えば CDYW9R と打つと 9RDYW9 と表示される、というように。偶然、Samsung端末を所持しておりわかった不具合でした。
原因:入力の「確定前」に手を出していた
スマホのキーボードは、文字を1つ打つごとにすぐ確定しているわけではありません。特に予測変換が効いていると、「まだ確定していない途中の文字列」をキーボード側が内部で持っています。これを「編集中領域」と呼びます。
今回のアプリでは、1文字入力されるたびに「大文字に変換する」「使えない文字を取り除く」「結果を入力欄に書き戻す」という処理を毎回走らせていました。この「書き戻す」処理が、キーボードが編集中領域として持っている文字列と食い違いを起こしていました。キーボード側は「アプリが勝手に書き換えた」と検知すると、持っている文字列を再送してきます。これが繰り返された結果、文字が重複したり順番が入れ替わったりして見えていた、というのが原因です。
iPhoneや別のAndroidキーボード(Gboardなど)では起きませんでした。
対応:入力中は一切書き戻さず、入力が終わったタイミング(確定時)だけ整形するように変更しました。見た目上は「入力中は小文字のまま表示され、確定した瞬間に大文字になる」という動きになりますが、文字化けよりはずっとましです。
2. 復元直後、戻るボタンを押すと一部データが消える問題
新しい端末でデータを復元したあと、「2.5秒待ってからホーム画面に自動で戻る」という仕様になっていました。ところがこの2.5秒の間に、ユーザーが自分で戻るボタンを押してしまうと、正誤記録などほとんどのデータは復元されているのに、「解答状況(未解答・途中・終了の表示)」だけが復元前の状態に戻ってしまう、という不具合が起きていました。
原因:ボタンの行き先が違っていた
調べてみると、自動で2.5秒後に遷移する先の画面と、戻るボタンが遷移する先の画面が別のシーンでした。戻るボタンを押すと、データを最終的に反映する大事な仕上げ処理を素通りしてホームに戻ってしまっていた、ということです。
対応:復元が成功した瞬間から、自動遷移が終わるまでの間、戻るボタンやタブの切り替えボタンを操作できないようにロックしました。処理の途中でユーザーが割り込めないようにする、という単純ですが確実な対策です。
3. 通信が遅いと、いつまでも「読み込み中」のまま止まる問題
機内モードなど、明らかに繋がっていない場合はすぐにエラーが表示されるのですが、「電波は入っているが極端に遅い」という状況では、画面がずっと「読み込み中」のまま固まっていました。
原因:「タイムアウト」が働かない状況があった
通信プログラムには「一定時間反応がなければ諦める」というタイムアウトの仕組みが入っています。ところがこの仕組みは「まったく反応がない」場合にしか働きません。電波が弱くてもデータが少しずつでも流れていれば、「反応はある」とみなされ続け、何十分待っても終わらないことがあります。
対応方針:明らかにネットに繋がっていない状態なら通信を試す前に即座にエラーを出す対策は実装済みです。加えて、通信の進み具合を毎瞬チェックし、一定時間まったく進まなければ強制的に打ち切る仕組みも今後入れる予定です。
4. データ全削除機能に潜んでいたバグ
引き継ぎ機能とは別件ですが、調査の過程で「全データ削除」機能に3つの不具合が見つかりました。
過去問を削除するはずが、直前に模擬試験の画面を開いていると模擬試験側が削除されてしまう
「腕試し模擬試験」だけ特別扱いされているはずが、削除処理の中でズレが生じ、意図せず上書きされてしまう
保存するデータの個数が1つ足りず、内部的に不整合な状態になっていた
これらは変数の取り違えや、繰り返し処理の開始位置のズレが原因でした。
今後に向けて
次は「過去問が追加されると、正誤記録や集計表がリセットされてしまう」という課題に取り組むつもりです。