시뮬레이터에서 앱 제거 후 NSUserDefaults가 지워지지 않음


95

이것은 진짜 NOOB처럼 들릴 수 있습니다! 사용자가 두 번째로 내 응용 프로그램을 입력하는지 확인하여 사용중인 실행 횟수를 유지합니다 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];

모든 것이 잘 작동하지만 문제는 여기여기 에 따라 응용 프로그램을 제거 (삭제 및 재설치) 할 때 데이터가 지워 져야한다는 것입니다. xCode6-beta를 사용하고 iOS 8에서 애플리케이션을 대상으로하는 iOS 시뮬레이터에서 내 앱을 실행하고 있습니다.


2
실제 장치에서 테스트 해 보셨습니까?
Henry F

시뮬레이터에서 수동으로 지워야합니다. 방법은 다음과 같습니다 .
dasblinkenlight 2014

이 질문에 더 이상 답이없는, 그래서 정답을 표시주세요
앤더스

1
@Reza : [[NSUserDefaults standardUserDefaults] setObject : selectedLists forKey : UserID]. 내 앱은 ios6 및 ios7에서 잘 작동하지만 ios8에서 여기에 충돌합니다. 여기서 NSMutable Array 및 UserId의 selectedlists 는 문자열입니다.
Manthan

@Manthan 이것은 몇 가지 다른 문제이지만 다른 곳에서 동일한 문제에 직면했으며 충돌을 일으킨 이유는 일부 키에 대해 저장 한 객체가 NSMutableArraya로 저장 NSArray되고 변경하면 내 앱이 충돌했습니다. .. 나는 저장하는 것이 좋습니다 NSArray당신이 캐스팅 나중에 사용할 때 NSMutableArray사용 [NSMutableArray arrayWithArray:array];. 도움이 되었기를 바랍니다.
Reza Shayestehpour 2014 년

답변:


169

iOS8 베타 시뮬레이터의 버그 때문이라고 생각합니다.

예상되는 동작은 앱이 삭제되면 해당 앱의 NSUserDefaults도 삭제되는 것입니다.

  • 그러나 시뮬레이터에서 앱을 제거 할 때 NSUserDefaults는 삭제 되지 않습니다 .
  • iOS8을 실행하는 물리적 장치에서 삭제하면 올바르게 삭제됩니다.

현재 빠르고 성가신 해결책은 iOS 시뮬레이터-> 콘텐츠 및 설정 재설정을 클릭하는 것입니다.

Simulator 10이 포함 된 Xcode 9.2는 여전히이 문제를 나타냅니다. 메뉴 옵션은 이제 하드웨어입니다 .. 모든 컨텐츠 및 설정 지우기

버그 보고서를 제출했습니다 btw


45
iOS 8 GM에서 테스트했으며 버그는 여전히 존재합니다. 매우 짜증납니다.
Manfred Scheiner 2014 년

1
Xcode 6 GM 시뮬레이터 및 iOS 8 (12A365)에서도이 버그 동작을 확인할 수 있습니다!
Boris Brdarić 2014 년

1
케이스를 팔로우하려는 사용자를위한 기존 Open Radar 링크 : openradar.appspot.com/18540702
viggio24

1
XCode 6.1 (6A1052d)로 업데이트 한 후 SDK 8.1에서 버그가 수정 된 것 같습니다
kas-kad

2
같은 문제에 직면 한 모든 사람을 위해. 동일한 그룹에 둘 이상의 앱이 있고 모든 앱이 앱 그룹을 사용하는 경우 (기능에서 ON), 사용자 기본값을 지우려면 장치에서 모든 앱을 제거해야합니다. 사용자 기본값이 공유되기 때문에 앱 중 하나가 장치에 있어도 해당 앱이 userdefaults를 사용하므로 삭제되지 않습니다.
Ankit Srivastava

14

콘텐츠 및 설정 재설정은 핵 옵션이므로 iOS 8 / Xcode 6 GM 시뮬레이터의 버그가 해결 될 때까지 두 가지 다른 옵션을 고려할 수 있습니다.

  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 /가 누락되었습니다.
The dude

5

같은 문제에 직면 한 사람을 위해.

동일한 그룹에 둘 이상의 앱이 있고 모든 앱이 앱 그룹을 사용하는 경우 (기능에서 ON), 사용자 기본값을 지우려면 장치에서 모든 앱을 제거해야합니다.

사용자 기본값이 공유되기 때문에 앱 중 하나가 기기에 있어도 해당 앱이 userdefaults를 사용하므로 삭제되지 않습니다.


4

코드는 장치에서 잘 작동합니다. 시뮬레이터에 버그가있을 수 있습니다.

시뮬레이터의 내용 및 설정을 재설정 해보십시오.


1
콘텐츠 및 설정 초기화는 정상적으로 작동하며 현재 확인할 기기가 없습니다. TNX :
레자 Shayestehpour

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.