読者です 読者をやめる 読者になる 読者になる

おけやの日々

株式会社おけやのブログです。業務、企画、技術の事など様々な事を書きます。

iOS で落ちる不具合を直した件のご報告

まじょのおしごとメインプログラマの吉田です。

iOS 版まじょのおしごとで各施設に入ろうとすると落ちる不具合を修正しました。 apple の審査も通り無事 ver 1.2.4 となり、 iOS の方も安定して遊んでもらえるようになりました。

まじょのおしごとに不具合があるのは全て私の責任です。 不具合を発見された方は是非お問い合わせや Twitter でご連絡いただきたいです。

さて、今回の不具合について得た知識やコードは共有する価値があると思います。 謝罪も兼ねて詳しく説明させていただきます。

何が起きたのか?

まじょのおしごとの ver 1.2.0 をインストール済みの方が 1.2.3 にアップデートした場合や新規に 1.2.3 をインストールしてしばらく遊んだ後「けんきゅうじょ」や「したてや」など各施設に入ろうとすると落ちるという現象が起きるようになりました。

原因は何だったのか?

こすちゅーむ や おばけ などの画像データやアニメーションのデータはアプリのインストール後、 zip に固めたデータをダウンロードして使用しています。 そのデータが端末から消えてしまい、アニメーションを動かそうというところで落ちてしまうことになりました。

なんでそんなことになったのか?

iOS Data Storage Guidelines という iOS のデータをどこに置くべきかというガイドラインがあります。 このガイドラインに準拠しないと apple の審査に通りません。 iOS 端末のデータは iCloud にバックアップされるのですが、再取得可能なデータや一時的なデータはいちいちバックアップさせるなという主旨です。 インターネットから再取得出来るデータなのでこのガイドラインに従い /tmp に画像データやアニメーションのデータを置いていました。 しかしながら /tmp のデータはどうやら 端末から勝手に消されることがあるのでした。

今回の現象によるとアプリの更新時と端末の再起動時に消されるようです。

修正がなかなか出来なかったのは再現手順がわからなかったからです。 私は開発にあたり何回も消したり新しくインストールしたりします。 ですので私がテストしている間はこの現象に出くわしません。

相方の iPhone では当初 1.2.0 から 1.2.3 へ appstore 経由でアップグレードしたので現象は再現しておりました。

そこで原因を探るため開発用のモードでビルドしてインストールすると同様に直ってしまいました。

端末を再起動すると再現することに気づいたのはたまたま電池切れになったからでした。

1.2.0 で楽しんでいただいていて、やっと「へんせい」の不具合が直った 1.2.3 をインストールしてみるとほぼ全て動かなくなるということになってしまう現象にあたってしまった方には本当にお詫びの気持ちしかないです。

どうやって直したのか

ファイルの存在をチェックして、無ければ再ダウンロードしようかとも考えました。 しかしながら 30MB 近いファイルを再起動の度にダウンロードするのはプレイ体験としても回線事情を考えても苦痛だろうと思いました。 そこで別の方法を取ることにしました。 iCloud へバックアップさせないために "do not backup" という属性を該当のディレクトリに付ける事が出来るのですが、これを試しました。 具体的なコードは技術的な話過ぎるので別の記事にさせてもらいますが、この方法で上手く apple の審査に通ることも出来ました。

感想

当初自分の端末で再現しないからということでいずれ再現するかと思い放置していました。 ある意味電池切れを契機に再現したので狙った通りなのですが /tmp は再起動すると消えるという事さえ知っていればもっと早く気付けたのだと思います。 ですので iOS アプリ開発をされている方はテストケースの中に「端末を再起動する」というのをいれておくことをおすすめします。 今回の件は人生で一度行き当たれば以降は回避が可能な問題です。 iOS アプリを開発していて iOS Data Storage Guildelines で審査に落ちた方などにこの事を伝え今回のような開発者もユーザーも不幸になるような事が無くなるようにしたいです。

このような苦労をしつつなんとか開発しているのが「まじょのおしごと」です。 私が苦労している事とゲームが楽しいことはまったく関係なく、プレイをしていただいた皆様はゲームが楽しいかどうかだけを評価していただければいいのですが、その舞台裏にこのような事があったということをそっと記録として残しておきます。