NSUserDefaultsは、Appstore内のアプリへの更新を通じて存続しますか?


106

これは事実ですか?NSUserDefaultsは、App Storeでアプリの更新を送信したときにリセットされますか、それともリセットされますか?

アプリは更新時にクラッシュしますが、完全にダウンロードするとクラッシュしません-更新されたセッションと新しくダウンロードされたセッションで何が異なる可能性があるのか​​を特定しようとしています。

乾杯、ニック。


内のファイルのドキュメント、およびライブラリがされます保存:ドキュメントの主張としてdeveloper.apple.com/library/ios/#DOCUMENTATION/iPhone/...
ジェリBorbás

回答:


116

ユーザーがアプリを削除しない限り、通常はリセットされません。基本データの場合、設定、日付、文字列などのデータを保存するにはNSUserDefaultsが最適です。画像やファイルを保存する場合は、ファイルシステムの方が適しています。


5
これが言及されているアップルのドキュメントのどこかにありますか?
Nick Cartwright、

1
申し訳ありません-私はあなたの迅速な回答に感謝するのを忘れていました!-誰かがこれを説明しているAppleのドキュメントへのリンクを見つけることができれば、それはすばらしいでしょう。これはAppleがアプリを確実に更新するための最も安全な方法のように思えます!
Nick Cartwright、

最も安全な方法かもしれませんが、アプリが更新されるたびにすべての設定を再設定しなければならない場合、ユーザーにとっては非常に煩わしいでしょう。通常、1日に3〜4個のアプリの更新があります。他のiPhoneユーザーはもっと持っていると思います。各アップデートの設定を消去すると、基本的に私のiPhoneが使用できなくなります。
クリストファージョンソン

1
ドキュメントフォルダ内のデータは、NSUserDefaultsと同じくらい簡単に消えることがあります。しかし彼らは、両方ともまれであり、通常のアップグレードプロセスとは全く関係ありません
coneybeare

1
クリストファーに感謝します-はい、同意します。私の問題は、NSUserDefaultsを使用してプログラムによるイベントを保存し、アプリのインストール時にリセットされることに依存していたことでした。iPhoneデバイスでの私のすべてのテスト(およびApplesのテスト)では、アプリを新規インストールとしてテストしました。ドキュメントやアップデートとしてテストする方法がなければ、アップデートのクラッシュを繰り返すことができませんでした。要約すると、おそらくレッスンは難しい方法を学びました!!
Nick Cartwright、

7

私は答えがイエスだと思います、それは持続します。これは、Apple iPhone OSプログラミングガイドのアプリケーションディレクトリの章にも詳しく記載されています。


4
  1. 投稿された質問への直接の回答:はい。
  2. 問題:ロジックの問題が原因でアプリがクラッシュします。オブジェクトをデフォルトで保存し、アプリが起動時に(または他の場所で)その値をチェックするとします。更新では、値が期待されるなど、チェックまたは使用される方法を変更できますが、オブジェクトはnilであるか、またはその逆です。これにより、SIGABRTまたはEXC_BAD_ACCESSが発生する可能性があります。

2

CoreDataモデルがあり、移行を管理せずにモデルと更新で何かを変更した場合、それがおそらくアプリが更新時にクラッシュする理由です...


私はそれがケースかもしれないと期待:)ないNSUserdefault
ジュリアンKról

1

同様の経験があります。アプリのバージョン番号は、Settings.Bundle / Root.Plistに保存されています。これは、iPhone設定アプリから表示されます。インストールでバージョン番号がApp Bundleから読み込まれることがわかります。したがって、バージョン番号は正しいです。ただし、更新時にはバージョン番号は変わりません。これは、ユーザーが以前のバージョンのアプリを実行しているような印象を与えます。バージョン番号にリンクされたロジックはありません。これは表示用です(コンタクトセンターのスタッフが障害を診断するときに使用できます)。

私たちの経験では、ユーザーがアプリを更新してもNSUserDefaultsはクリアされませんが、設定表示も更新されません。


0

アプリがバックグラウンドで実行されていて、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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.