これは事実ですか?NSUserDefaultsは、App Storeでアプリの更新を送信したときにリセットされますか、それともリセットされますか?
アプリは更新時にクラッシュしますが、完全にダウンロードするとクラッシュしません-更新されたセッションと新しくダウンロードされたセッションで何が異なる可能性があるのかを特定しようとしています。
乾杯、ニック。
これは事実ですか?NSUserDefaultsは、App Storeでアプリの更新を送信したときにリセットされますか、それともリセットされますか?
アプリは更新時にクラッシュしますが、完全にダウンロードするとクラッシュしません-更新されたセッションと新しくダウンロードされたセッションで何が異なる可能性があるのかを特定しようとしています。
乾杯、ニック。
回答:
ユーザーがアプリを削除しない限り、通常はリセットされません。基本データの場合、設定、日付、文字列などのデータを保存するにはNSUserDefaultsが最適です。画像やファイルを保存する場合は、ファイルシステムの方が適しています。
CoreDataモデルがあり、移行を管理せずにモデルと更新で何かを変更した場合、それがおそらくアプリが更新時にクラッシュする理由です...
同様の経験があります。アプリのバージョン番号は、Settings.Bundle / Root.Plistに保存されています。これは、iPhone設定アプリから表示されます。インストールでバージョン番号がApp Bundleから読み込まれることがわかります。したがって、バージョン番号は正しいです。ただし、更新時にはバージョン番号は変わりません。これは、ユーザーが以前のバージョンのアプリを実行しているような印象を与えます。バージョン番号にリンクされたロジックはありません。これは表示用です(コンタクトセンターのスタッフが障害を診断するときに使用できます)。
私たちの経験では、ユーザーがアプリを更新してもNSUserDefaultsはクリアされませんが、設定表示も更新されません。
アプリがバックグラウンドで実行されていて、NSUserDefaultsに保存されている値にアクセスできない場合は、このケースに注意してください。
エリック:
これについては多くのスレッドとバグがありましたが、iOS 9では再び発生しています。NSURLSessionタスクとコンテンツで利用可能なプッシュに応答してバックグラウンドで起動するアプリがあります。携帯電話を再起動してアプリのバックグラウンド起動が発生するのを待つと、再現性があります。アプリを開くと、[[NSUserDefaults standardUserDefaults] dictionaryRepresentation]にAppleITunesStoreItemKindsなどのすべてのシステム値が含まれているが、含まれていないことがわかります。私が設定した値のいずれか。アプリを強制終了して再起動すると、すべての値が元に戻ります。スマートフォンがロック解除される前から「空の」standardUserDefaultsをキャッシュしないようにする方法、または少なくともアプリが強制終了せずにめちゃくちゃになったときに判断して修正する方法はありますか?
エスキモー(eskimo1@apple.com):
ここでの問題は、NSUserDefaultsが最終的にアプリのコンテナー内のファイルによってサポートされ、アプリのコンテナーがデータ保護の対象となることです。特に何もしない場合、iOS 7以降では、コンテナーはNSFileProtectionCompleteUntilFirstUserAuthenticationを使用します。この値はNSUserDefaultsバッキングストアによって継承されるため、最初にロックを解除する前にアクセスすることはできません。
IMOのこれを回避する最良の方法は、バックグラウンドで実行できるコードパスで依存するものについてNSUserDefaultsを回避することです。代わりに、これらの設定を独自の設定ファイルに保存します。このファイルは、データ保護を明示的に管理できます(この場合、「NSFileProtectionNoneに設定」を意味します)。
データ保護コンテキストのNSUserDefaultsには2つの問題があります。
その完全に抽象的なAPI:バッキングストアの存在と場所はそのAPIの一部とは見なされないため、データ保護を明示的に管理することはできません。
注OS Xの最近のバージョンでは、NSUserDefaultsはデーモンによって管理されており、バッキングストアを直接操作しようとするユーザーは問題に直面しています。いつの日か同じ種類のものがiOSに登場することは容易に想像できます。
データ保護の変更が可能であったとしても、NSUserDefaultsには、データを使用しているコンテキストに基づいてデータを分類するメカニズムがありません。これは「オールオアナッシング」のAPIです。あなたのケースでは、すべてのユーザーデフォルトから保護を削除するのではなく、最初にロックを解除する前にバックグラウンドでアクセスする必要があるものだけを削除します。
最後に、このデータのいずれかが本当に機密である場合は、キーチェーンに入れる必要があります。特に、キーチェーンには、アイテムごとにデータ保護を設定する機能があります。
ソース:https : //webcache.googleusercontent.com/search?q=cache : sR9eZNHpZtwJ : https : //forums.developer.apple.com/thread/15685