web-dev-qa-db-ja.com

シミュレーターでのアプリのアンインストール後にNSUserDefaultsがクリアされない

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

    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];

すべてが正常に機能しますが、問題は、 here および here に従ってアプリケーションをアンインストール(削除および再インストール)すると、データがクリアされるはずですが、そうではないということですアプリを再インストールした後、以前のデータが引き続き表示されます。 xCode6-betaを使用してiOSシミュレーターでアプリを実行し、iOS 8でアプリケーションをターゲットにしています

92

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

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

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

現時点での迅速で迷惑な解決策は、iOSシミュレーター->コンテンツと設定のリセットをクリックすることです。

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

バグレポートを送信しました

166
anders

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

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

  2. plistbuddy を使用して、そのplistで(おそらく実行スクリプトのビルドフェーズを使用して) "手術"を実行できます。

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

14
FluffulousChimp

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

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

コードはデバイスで正常に動作するはずです。おそらくシミュレーターのいくつかのバグ。

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

4
ppalancica

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

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

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

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はなくなります。

そのため、シミュレータをリセットする面倒な方法は不要になりました。

2
sys4tron

これはまだバグですが、別のオプションは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
AdamT