source

NSUser Defaults 클리어

ittop 2023. 4. 22. 10:27
반응형

NSUser Defaults 클리어

사용하고 있다+[NSUserDefaults standardUserDefaults]응용 프로그램 설정을 저장합니다.이것은 약 12개의 문자열 값으로 구성됩니다.이러한 값을 기본값으로 설정하지 않고 영구적으로 삭제할 수 있습니까?

다음과 같이 응용 프로그램의 영구 도메인을 제거할 수 있습니다.

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

Swift 3 이상:

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

이것은 @samvermette의 답변과 비슷하지만 IMO가 조금 깨끗합니다.

이 코드는, 디폴트의 등록 도메인을 리셋 합니다.

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

바꿔 말하면removeObjectForKey그 앱에 등록한 모든 키에 대해 사용할 수 있습니다.

이 Apple Developer Forums 스레드의 Ken Thomases 크레딧.

사용해보셨습니까?removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];

다음은 Swift의 답변입니다.

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)

개발 중에 필요한 경우 시뮬레이터를 리셋하여 모든 컴포넌트를 삭제할 수도 있습니다.NSUserDefaults.

iOS 시뮬레이터 -> 콘텐츠 및 설정 리셋...

시뮬레이터의 모든 앱과 파일도 삭제됩니다.

NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}

Swift의 경우:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }

코드를 깔끔하게 하는 확장자를 좋아합니다.

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}

스위프트 5

extension UserDefaults {
    func clear() {
        guard let domainName = Bundle.main.bundleIdentifier else {
            return
        }
        removePersistentDomain(forName: domainName)
        synchronize()
    }
}

주의: 이 답변은 Swift에도 업데이트되었습니다.

한 줄에 담는 건 어때요?

@Christopher Rogers의 답변을 확장합니다.– 승인된 답변입니다.

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

그리고 네, 가끔은synchronize그거,

[[NSUserDefaults standardUserDefaults] synchronize];

이걸 할 수 있는 방법을 만들었는데

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

재빠르다?

스위프트는 훨씬 더 쉽다.

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

용도:

UserDefaults.clean()

이걸 찾았어요

osascript -e 'tell application "iOS Simulator" to quit'
xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}"

출처 : https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab

위의 답변은 모두 매우 관련이 있지만 삭제된 앱의 사용자 기본값을 재설정할 수 없는 경우 시뮬레이터의 콘텐츠 설정을 재설정할 수 있습니다. 그러면 작동합니다.여기에 이미지 설명 입력

버그든 뭐든 간에removePersistentDomainForName모든 파일을 클리어하는 동안 동작하지 않습니다.NSUserDefaults가치.

그래서 더 좋은 방법은 이 시스템을PersistentDomain다음과 같은 방법으로 수행할 수 있습니다.

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)

@folse의 답변에 대해 자세히 설명하자면...더 정확한 구현은...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

...NSUserDefault의 persistentDomainForName 메서드를 호출합니다.docs가 기술하고 있듯이 메서드는 "지정된 영속 도메인의 키와 값을 포함하는 사전을 반환합니다." 대신 dictionaryRepresentation:을 호출하면 더 넓은 범위에 적용되므로 다른 설정을 포함할 수 있는 사전이 반환됩니다.

리셋할 값을 필터링 할 필요가 있는 경우는, 키를 사용해 반복하는 것이 방법입니다.물론 앱의 모든 프리프(pref)를 신경 쓰지 않고 nuking하고 싶다면 위에 게시된 다른 방법 중 하나가 가장 효율적입니다.

리셋이 필요한 애플리케이션 설정이 nsuserdefault인 경우(내 경우), Anthony McCormick의 답변(Iphone - 장치의 미디어에 대한 애플리케이션 액세스를 활성화하는 방법? - ALAssetsLibraryErrorDomain Code=-3312 "글로벌 액세스 거부")입니다.

디바이스에서 [설정]으로 이동합니다.일반>리셋>로케이션 리셋 경고

이거 먹어봐, 나한테는 효과가 있어.

코드 한 줄

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

언급URL : https://stackoverflow.com/questions/545091/clearing-nsuserdefaults

반응형