個人アプリで起動できない不具合を出した話
加賀ゆびぬき刺し模様シミュレータv1.2.2でアプリを起動できない不具合を出した。 反省として記録する。
経緯
リリース直後から、Crashlyticsの通知が来はじめて、悪い予感はしていた。 クラッシュ原因は、おそまつなぬるぽで、コードの修正はすぐにできるものの、ユーザー体験のなかでどのタイミングで発生するかはなかなかわからなかった。 実家に行く用事があって、母が「こうするとだめなんだけど」と教えてくれて、ようやくはっきりした。
この時点で、アプリを起動できない不具合であることがわかり、急いでツイッターへお知らせを投稿した。
不具合を修正して、特急審査を要請したところで、これを書いている。
不具合の原因
今回まずかった点は大きく3つある。
- nullチェックが抜けた
- APIの理解不足
- データ読み込み処理が、フェールセーフでない
- 意図していないデータが入ってきた場合を考慮していなかった
- オートセーブデータのロードに失敗するのが今回の現象だが、ユーザーが意識しないものなので、なにかマズいときでもクラッシュしてはいけない
- force castを使用している箇所があり、想定外の状態に弱い実装だった
- 対策: swiftlintでまずそうな箇所を検出して対応した
- 後方互換性のテストを欠いていた
- 開発バージョンを間にインストールしていたため、リリース版v1.2.1 -> v1.2.2の状況を再現できていなかった
- 対策: deploygate で各リリースバージョンを保持し、後方互換テストをできる環境を用意した
- 開発バージョンを間にインストールしていたため、リリース版v1.2.1 -> v1.2.2の状況を再現できていなかった
課題:「ここは何かおきても、例外を握りつぶしておきたい」という仕様に対する実装方法
今回の問題の箇所は、Objective-Cで実装していたため、汎用的な例外キャッチを局所的に適用することで、 「なにがあってもクラッシュしない」を実現した。
Swift実装の場合、Swiftの例外処理が、「例外を投げてくる処理」に対してのみ有効なので、 「なにがあってもクラッシュしない」を実現できないような気がしている。