Что может привести к очистке NSUserDefaults
Я получаю несколько нечетных отчетов для своего приложения, где параметры приложения, хранящиеся в NSUserDefaults
, очищаются. Все отчеты были на iOS 7s
Я знаю, что вы можете вручную очистить NSUserDefaults
, удалив или сделав звонок
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Но есть ли другие известные причины для приложения, чтобы очистить его настройки?
- IOS: сохранение массива с помощью NSUserDefault
- iOS NSDictionary сохраняется в NSUserDefaults, не сохраняя значения
- Я ничего не должен сохранять в NSUserDefaults
- Попытка вставить объект списка объектов без сохранения при попытке сохранить пользовательский объект в Swift 3
- UIAlertView требует времени, чтобы показать
- Возможно ли, что значения UserDefaults.standard не будут доступны для чтения?
- Постоянное обновление расширения приложения
- Сохранение пользовательских объектов в NSUserDefaults
- Добавление изображений в массив
- Способ сохранения объектов MPMediaItemCollection? (выбирается из iPod)
- Swift: не сохраняет значения NSUserDefaults.standardUserDefaults
- iOS 10 с XCode 8 GM заставил NSUserDefaults прерывисто работать
- iOS 10 Пользовательские значения по умолчанию Crash - Crashed: com.apple.root.user-initial-qos SIGABRT
Если вы не хотите, чтобы ваши данные были удалены, вы должны использовать KeyChain для хранения значений. Хороший способ начать работу: использование KeyChain
Ниже я предоставляю пример кода, как хранить и получать данные из KeyChain
Импорт необходимых фреймворков
#import <Security/Security.h>
Сохранение значений в KeyChain
NSString *key = @"Full Name"; NSString *value = @"Steve Jobs"; NSData *valueData = [value dataUsingEncoding:NSUTF8StringEncoding]; NSString *service = [[NSBundle mainBundle] bundleIdentifier]; NSDictionary *secItem = @{ (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService : service, (__bridge id)kSecAttrAccount : key, (__bridge id)kSecValueData : valueData, }; CFTypeRef result = NULL; OSStatus status = SecItemAdd((__bridge CFDictionaryRef)secItem, &result); if (status == errSecSuccess) { NSLog(@"Successfully stored the value"); } else{ NSLog(@"Failed to store the value with code: %ld", (long)status); }
Получение ценностей от KeyChain
NSString *keyToSearchFor = @"Full Name"; NSString *service = [[NSBundle mainBundle] bundleIdentifier]; NSDictionary *query = @{ (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService : service,(__bridge id)kSecAttrAccount : keyToSearchFor, (__bridge id)kSecReturnAttributes : (__bridge id)kCFBooleanTrue, }; CFDictionaryRef valueAttributes = NULL; OSStatus results = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&valueAttributes); NSDictionary *attributes = (__bridge_transfer NSDictionary *)valueAttributes; if (results == errSecSuccess){ NSString *key, *accessGroup, *creationDate, *modifiedDate, *service; key = attributes[(__bridge id)kSecAttrAccount]; accessGroup = attributes[(__bridge id)kSecAttrAccessGroup]; creationDate = attributes[(__bridge id)kSecAttrCreationDate]; modifiedDate = attributes[(__bridge id)kSecAttrModificationDate]; service = attributes[(__bridge id)kSecAttrService]; NSLog(@"Key = %@\n \ Access Group = %@\n \ Creation Date = %@\n \ Modification Date = %@\n \ Service = %@", key, accessGroup, creationDate, modifiedDate, service); } else { NSLog(@"Error happened with code: %ld", (long)results); }