これは本当のNOOBに聞こえるかもしれません!ユーザーがアプリケーションを2回入力するかどうかを確認したいので、実行カウントを維持するためにNSUserDefaults
を使用しています。 rootViewController
のviewDidLoad
メソッドに次のコードを実装しました。
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でアプリケーションをターゲットにしています
これはiOS8 Beta Simulatorのバグが原因だと思います。
予想される動作では、アプリが削除されると、そのアプリのNSUserDefaultsも削除されます。
現時点での迅速で迷惑な解決策は、iOSシミュレーター->コンテンツと設定のリセットをクリックすることです。
シミュレーター10を搭載したXcode 9.2では、この問題が引き続き発生します。メニューオプションがハードウェアになりました..すべてのコンテンツと設定を消去
バグレポートを送信しました
コンテンツと設定のリセットは核のオプションであるため、iOS 8/Xcode 6のバグGMシミュレーターが対処されるまで、他の2つのオプションを検討できます。
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
plistbuddy を使用して、そのplistで(おそらく実行スクリプトのビルドフェーズを使用して) "手術"を実行できます。
/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist
これはバグであり、次のコードでNSUserDefaultsを削除できます
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
コードはデバイスで正常に動作するはずです。おそらくシミュレーターのいくつかのバグ。
シミュレーターの内容と設定をリセットしてください。
同じ問題に直面している人のために。
同じグループに複数のアプリがあり、それらすべてがアプリグループを使用している場合(機能の下でON)、ユーザーのデフォルトをクリアするには、デバイスからすべてのアプリを削除する必要があります。
ユーザーのデフォルトは共有されているため、アプリの1つがデバイス上にある場合でも、そのアプリはuserdefaultsを使用するため、削除されません。
私の場合、次のディレクトリに* .plistが見つかりました。
[1]/Users /SOME-USERNAME/ Library/Developer/CoreSimulator/Devices /SOME-DEVICE-ID / data/Library/Preferences/SP.UserDefaultsTest.plist
問題: xCode 6(iOS 8シミュレーター)でアプリを削除しても、ファイルは上記のようにディスク上に残ります。
解決策:パス[1]から見つかったファイルを手動で削除すると、NSUserDefaultsはなくなります。
そのため、シミュレータをリセットする面倒な方法は不要になりました。
これはまだバグですが、別のオプションは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
を追加すると、アプリの最初の実行がシミュレートされ、コメントアウトすると、以降のアプリの実行がすべてシミュレートされます。