シミュレータでアプリをアンインストールした後、NSUserDefaultsがクリアされない


95

これは本当のNOOBに聞こえるかもしれません!ユーザーがアプリケーションに2回目かどうかを確認したいので、使用している実行カウントを維持しますNSUserDefaultsrootViewControllerviewDidLoadメソッドに次のコードを実装しました。

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

すべてが正常に動作しますが、問題は、ここここに従ってアプリケーションをアンインストール(削除して再インストール)するとデータがクリアされるはずですが、アプリが再インストールされても以前のデータがまだ表示されているということです。xCode6-betaを使用してiOSシミュレーターでアプリを実行し、iOS 8上のアプリケーションをターゲットにしています


2
実際のデバイスでテストしてみましたか?
ヘンリーF 14

シミュレータで手動でクリアする必要があります。こちらがその方法です。
dasblinkenlight 2014

正解をマークしてください。この質問が未回答にならないようにしてください
Anders

1
@Reza:[[NSUserDefaults standardUserDefaults] setObject:selectedLists forKey:UserID]。私のアプリはios8でクラッシュしますが、ios6とios7では正常に動作します。ここで、NSMutable ArrayおよびUserIdの selectedlists は文字列です。
マンタン2014年

@Manthanこれはいくつかの別の問題ですが、どこかで同じ問題に直面し、クラッシュを引き起こした理由は次のとおりです。私がいくつかのキーのために保存していたオブジェクトはNSMutableArray、として保存され、NSArray変更するとアプリがクラッシュしました。 ..を保存し、NSArray後で使用したい場合は、をにキャストすることをお勧めNSMutableArray[NSMutableArray arrayWithArray:array];ます。お役に立てば幸いです。
Reza Shayestehpour 2014年

回答:


169

これはiOS8 Beta Simulatorのバグが原因だと思います。

予想される動作は、アプリが削除されると、そのアプリのNSUserDefaultsも削除されることです。

  • ただし、シミュレータからアプリを削除しても、NSUserDefaultsは削除されません
  • iOS8を実行している物理デバイスから削除すると、正しく削除されます。

今のところ素早くて面倒な解決策は、iOSシミュレーター->コンテンツと設定のリセットをクリックすることです。

Xcode 9.2でSimulator 10を使用すると、この問題が引き続き発生します。メニューオプションはハードウェアになりました。すべてのコンテンツと設定を消去します。

バグレポートを提出しました


45
iOS 8 GMでテストしましたが、バグはまだ存在しています。とてもうるさい。
Manfred Scheiner、2014

1
Xcode 6 GMシミュレーターとiOS 8(12A365)でこのバグのある動作を確認することもできます!
BorisBrdarić2014

1
ケースをフォローしたい人のための既存のOpen Radarリンク:openradar.appspot.com/18540702
viggio24 '21

1
XCode 6.1(6A1052d)にアップデートした後、SDK 8.1でバグが修正されたようです
kas-kad

2
同じ問題に直面している人のために。同じグループに複数のアプリがあり、それらのすべてがアプリグループを使用している場合(ケーパビリティでオン)、ユーザーのデフォルトをクリアするには、デバイスからすべてのアプリを削除する必要があります。ユーザーのデフォルトは共有されるため、アプリの1つがデバイス上にある場合でも、そのアプリはuserdefaultsを使用するため、削除されません。
Ankit Srivastava

14

コンテンツと設定のリセットは核となるオプションであるため、iOS 8 / Xcode 6 GMシミュレーターのバグが解決されるまで、他の2つのオプションを検討できます。

  1. NSUserDefaultsが格納されているplistファイルを手動で削除できます。これは現在、次の場所~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist にあります。UUIDディレクトリ名の中から適切なシミュレータを見つけるのは少し面倒です。編集:2014-10-28 20-34-52正しいパス: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. あなたは使って(おそらく実行スクリプトのビルドフェーズを使用して)そのplistの上で「手術」を行うことができplistbuddy例えば

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist


/ * some_device_id * /の後に/ data /がありません

5

同じ問題に直面している人のために。

同じグループに複数のアプリがあり、それらのすべてがアプリグループを使用している場合(ケーパビリティでオン)、ユーザーのデフォルトをクリアするには、デバイスからすべてのアプリを削除する必要があります。

ユーザーのデフォルトは共有されるため、アプリの1つがデバイス上にある場合でも、そのアプリはuserdefaultsを使用するため、削除されません。


4

コードはデバイス上で正常に動作するはずです。シミュレータのバグかもしれません。

シミュレータの内容と設定をリセットしてみてください。


1
コンテンツと設定のリセットは問題なく動作し、現時点では確認するデバイスがありません。tnx :)
Reza Shayestehpour 14

4

これはバグであり、次のコードでNSUserDefaultsを削除できます

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

2

これはまだバグですが、別のオプションはNSUserDefaultsの特定のキーを削除することです。ほとんどの場合、テスト/開発時には、NSUserDefaultsのすべてではなく、いくつかのキーのみに関心があります。追加することを提案するよりもいくつかのキーのみを気にする場合removeObjectForKey

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

追加removeObjectForKeyすると、アプリの最初の実行がシミュレートされ、コメントアウトすると、以降のすべてのアプリの実行がシミュレートされます。


2

私の場合、私は次のディレクトリで* .plistを見つけました:

[1] / Users / SOME-USERNAME / Library / Developer / CoreSimulator / Devices / SOME-DEVICE-ID /data/Library/Preferences/SP.UserDefaultsTest.plist

問題: xCode 6(iOS 8シミュレーター)でアプリを削除しても、上記のようにファイルがディスクに残ります。

解決策:見つかったファイルをパス[1]から手動で削除すると、NSUserDefaultsがなくなります。

したがって、シミュレーターをリセットする煩わしい方法は不要になりました。

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