2014-04-18 18 views
7

Ho ricevuto alcuni rapporti insoliti per la mia app in cui le impostazioni dell'applicazione salvate nello NSUserDefaults vengono cancellate. I rapporti sono stati tutti su iOS 7sCosa può causare la cancellazione di NSUserDefaults

So che si può cancellare manualmente la NSUserDefaults o disinstallando o fare una chiamata a

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; 

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; 

Ma ci sono altre cause note per un app per cancellare le impostazioni?

+1

Sul mio iPhone jailbroken molte app perdono i loro NSUserdefaults dopo un arresto anomalo del sistema. Hai controllato se non è da iPhone jailbroken? – Selvin

+0

Non che io sappia, anche se la maggior parte di questi report sono stati sviluppati tramite build di sviluppo, il che significa che sono stati installati manualmente all'esterno dell'App Store. Dovrò controllare se fossero tutti. – loadedion

+0

Sono certi che vengano scritti in primo luogo? –

risposta

1

Se non si desidera eliminare i dati, è necessario utilizzare KeyChain per memorizzare i valori. Un buon modo per iniziare: Using KeyChain

Sotto sto fornendo un codice di esempio come memorizzare e ottenere i dati dal portachiavi

Importazione quadri richiesti

#import <Security/Security.h>

memorizzare i valori al portachiavi

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); 
} 

Recupero valori da 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); 
} 
+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – LittleBobbyTables

+0

Buon punto @LittleBobbyTables, sto per scrivere un esempio di thnx! :) – EridB

Problemi correlati