この記事には続きがあります!iOS 9.3.2 の NSUserDefaults

私は “にわか iOS デベロッパー”です。Apple の Developer Program へは iOS 7 の時から加入しています。
未だに1つもアプリをリリースしたことはありません。Objective-C なんてものは一切分かりません。

iOS 8 が発表された時に Swift も登場し、そこからやっとのことで Xcode を触り始めて今、自分の iPhone 6s Plus には 開発中のアプリが5つほど入っています。

iOS アプリに必要な機能

最近のアプリケーションでほぼ必須の機能といえば「ネットワークアクセスする機能」や、「データを保存する機能」が主だと思います。

Apple のアプリケーション開発時に「データを保存する機能」を簡単に実装したいと考えれば、NSUserDefaults 一択になるでしょう。

プログラムを書くときにはとりあえず、NSUserDefaults の synchronize() さえ忘れなければ しっかりとデータを保存することが出来ます。

ここで私の2016年2月21日の Google+ の投稿を見てみましょう。

はい、私はメインデバイスに beta の OS を入れてしまうのが好き(?)なのですが、この当時は iOS 9.3 beta 3 が iPhone 6s Plus に入っていました。

アップデートをした直後は気づきませんでしたが、しばらく使っていて ふと、LINE を起動したところ、「新規登録」の画面が現れました。

「うわ、LINE のデータ飛んだか…これは困った…」
個人的には LINE、あまり好きではないのですが、私も今を生きる学生ですので LINE がなければどうしても困ってしまいます。

とりあえず、メールアドレスとパスワードを入力して、SMS に届いた番号を入力して……と進んでいくと、「友だちが消えることはない」というのは知っていましたが、「トーク」やこれまでにインストールしたスタンプなどのデータが(再ダウンロードせずとも)残っていました。

普通のデータ消滅ではなさそう?

普通、LINE の「新規登録」という画面が現れるのは LINE のアプリ内から自らアカウントを削除したときや、他のデバイスから LINE にログインした時に現れる画面で、その時にトーク履歴なども全てデバイスから消えてしまいます。

しかし、今回の場合はそういったことはありませんでした。

また、私の愛用しているメーラーアプリ、Outlook も初期設定画面になっていました。Outlook に 7つほどメールのアカウントを設定していますので、1つ1つ 再度設定しなければならなくなってしまって苛立っていました。

これも私の愛用している 2段階認証時に使う Authy というアプリもデータが全飛び。通知センターや Apple Watch から 2段階認証のコードを見れるのでとても重宝していますが、初めて Authy をインストールした時に現れる「SMS 認証」の画面が登場し、私の快適生活を阻みました。

また、Twitter のキャッシュも全て消えていました。
さらには iPhone のステータスバーのバッテリー残量(%)の表示も消えていました。

これだけ多くのサードパーティ製アプリを含むのデータが一部だけ、一斉に消えてしまうのはおかしいと思いつつ、原因がわからなかったのでとりあえず放置。
まぁ、iOS も beta だし こんなバグなんて人柱の性だ。」と考えながら過ごしていました。

iOS 9.3 の beta もバージョンが上がって、正式版がリリースされた後もこのデータが消える現象は止まりませんでした。

募る怒り

特に LINE はひどいもので、ホームボタンを2回クリックした後に出てくるマルチタスクから LINE を消した後、もう一度開くと あの憎き画面、「新規登録」が現れるという事象が何度も繰り返されることがありました。このときは SMS 認証が省略されていました。もちろん、先ほど書いたとおり「トーク履歴」などのデータは無事です。

Mac で LINE を起動していることも多いのですが、ログイン中に iPhone でこのバグに遭遇しても、普通に Mac から LINE が出来ます。「新規登録」画面を抜けると一度、Mac 版 LINE の方が強制ログアウトされる仕様になっていました。

この段階で、私が開発しているアプリの NSUserDefaults を使った保存データが同タイミングで消えていたので、NSUserDefaults が原因であることは予想がついていました。このことをすでに Apple に報告済みです。

iOS は 9.3 から 9.3.1 へ

時は流れて iOS 9.3.1、これになっても NSUserDefaults で保存したデータが消える問題は収まらず、私も 発狂しそうになりながら Google+ で投稿し続けました。

どうしても iOS 開発者の方々とのつながりがあまりなく、データ収集にも苦労しましたが、2016年5月1日、Qiita を見たところ 気をつけろ!NSUserDefaultは消えるぞ! という記事が上がっていました。「NSUserDefault じゃなくて NSUserDefaults だぞ」という気持ちは置いておいて、「iPhone のデータがぶっ飛ぶのは私だけじゃなかったんだ…」と少し安心しました。

この問題のたちが悪い所は「いつ消えるのかわからない」、「突然消える」、「不特定多数のアプリのデータ及び本体設定のデータが消える」という部分にあります。
さらに、通知は通常通り届くので、アプリを立ち上げるまでデータが消えていることに気づきません。LINE ならトークが来れば通知が来ますし、通知から普通に返信することも出来て しっかり相手に届いています。しかし、LINE のアプリを立ち上げると「新規登録」が現れます。
Outlook もメールを受信した旨の通知がしっかりと来ます。通知センターから削除などのアクションも実行可能です。メール本文をチェックしようと Outlook アプリを立ち上げると、先ほども書いたように初めてアプリをインストールしたときの画面になります。
また、Qiita 記事にもあるように iOS 9.3 以降で発生します。

また、私の長い iOS 9.3.x 付き合いの経験から言うと、「Xcode で開発中のアプリを Run した後」もしくは「Run している最中」にかなりの確率でこのバグに遭遇します。

もちろん(?)、電車の中で LINE を何気なく使おうとした時に「新規登録」画面になっていることもありますが、Mac に iPhone を繋げているときがかなり怪しいです。

私はこのバグについてかなり怒っています。また、一般の人達のデバイスでこのバグにあったという話は聞いたことがないので、おそらく開発機特有の現象かと予測できます。

怒りに任せてひたすらキーボードを叩いたので、読みづらい文章になってしまったかと思いますが、もし、このような現象に遭遇されている方が他にもいらっしゃいましたら、私の Google+Twitter でこの記事を共有してくださると嬉しいです。

 

外部リンク