現在、iPhone アプリで次の奇妙な問題が発生しています。タイトルにあるように、NSUserDefaults
電話が再起動されてもロックが解除されない場合、カスタム キーと値が失われます。これは非常に特殊なシナリオで発生します。
コンテクスト:
NSUserDefaults
アプリ内では、ユーザーデータ (ユーザー名など) を保存するためにを使用しています。当アプリではバックグラウンドモードで位置情報が有効になっています。
この問題は、無線または Testflight で配布する場合にのみ発生します。Xcode を使用して .ipa (無線で配布されたものと同じもの) を携帯電話にドラッグ アンド ドロップすると、この問題は発生しません。
状況: ユーザーがアプリをインストールし、ログインすると、ユーザー名がNSUserDefaults
正常に保存されます。その後、ユーザーはデバイスの電源をオフにして再度オンにし、画面のロックを解除するまでしばらく電話を放置します。
問題: その間に重要な場所の変更がトリガーされると、アプリはバックグラウンドで起動しますが、NSUserDefaults
空です (Apple からのキーがいくつかあるだけで、カスタム キーはありません)。その後、NSUserDefaults
何をしてもこのキーが回復されることはありません (たとえば、電話のロックを解除してアプリを開くと、キーがまだ見つからないことがわかります)。
どのようなご助力やアイデアでも本当にありがたいです :)
ベストアンサー1
私も非常に似たような問題を抱えていました。アプリケーションをバックグラウンドで実行します。アプリケーションがメモリから削除されるまで、メモリを大量に消費する他のアプリケーションを使用します。(デバイスを接続し、Xcode でビルドを実行すると、このイベントを確認できます。Xcode は「メモリ不足のためアプリケーションが終了しました」と通知します)。ここから、アプリケーションがバックグラウンド フェッチ イベントに登録されている場合、ある時点で起動し、バックグラウンドで再起動されます。この時点でデバイスがロックされている場合、NSUserDefaults は null になります。
このケースを数日間デバッグした後、NSUserDefaults が破損または消去されたのではなく、デバイスがロックされているためアプリケーションがそれにアクセスできないことが分かりました。Xcode オーガナイザーを使用して手動でアプリケーション コンテンツをダウンロードしようとすると、実際にこの動作を確認できます。デバイスがロックされたままの場合、NSUserDefaults 設定を保存する plist が存在しないことがわかります。
デバイスがロックされているときにアプリケーションがバックグラウンドで起動されると、NSUserDefaults にアクセスできなくなります。大した問題ではありませんが、最悪なのは、アプリケーションがバックグラウンドで起動されると、メモリ内に残ることです。この時点で、ユーザーがデバイスのロックを解除し、アプリケーションをフォアグラウンドで起動しても、NSUserDefaults 内にはまだ何も残っていません。これは、アプリケーションが NSUserDefaults をメモリにロードすると (null になります)、デバイスがロック解除されたときにそれを再ロードする必要がないためです。この場合、同期は何も行いません。私の問題を解決するために見つけたのは、次の呼び出しでした。
[NSUserDefaults resetStandardUserDefaults]
メソッド内applicationProtectedDataDidBecomeAvailable
。
これが誰かの役に立つことを願います。この情報があれば、私は何時間もの苦しみから救われたかもしれません。