電話が再起動されてもロック解除されていない場合、NSUserDefaults のキーと値が失われます 質問する

電話が再起動されてもロック解除されていない場合、NSUserDefaults のキーと値が失われます 質問する

現在、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

これが誰かの役に立つことを願います。この情報があれば、私は何時間もの苦しみから救われたかもしれません。

おすすめ記事