Ho anche avuto questo problema, e mi ci sono voluti per sempre di capire
Esiste una versione di "KeychainWrapper" galleggianti intorno che ha il SecItemUpdate all'interno di un NSAssert (tra le altre cose).
Chiunque abbia fatto questo è un deficiente !, quando costruisce per la distribuzione/distribuzione ogni NSAssert viene annullato, il che significa che il codice non viene nemmeno eseguito.
Ad esempio:
NSAssert(SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck), @"Couldn't update the Keychain Item.");
deve diventare
OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck);
NSAssert(status == noErr, @"Couldn't update the Keychain Item.");
Notate come il SecItemUpdate attuale viene spostato al di fuori del NSAssert, e invece il risultato è controllato
Nota importante: Tentare aggiornare un valore per kSecValueData, senza specificare anche un valore per kSecAttrAccount, farà sì che anche l'asserzione fallisca. Quindi, se il vostro intento è quello di memorizzare una singola stringa di dati sensibili (come ad esempio un elenco di numeri di carta di credito), assicurarsi di memorizzare un testo "nome di account" nell'attributo kSecAttrAccount, in questo modo:
static NSString* kCardListXML = @"cardListXML";
static NSString* cardListAccountName = @"cardListAccount";
-(void)setCardListXML:(NSString*)xml {
KeychainItemWrapper* wrapper =
[[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil];
[wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)];
[wrapper setObject:xml forKey:(id)CFBridgingRelease(kSecValueData)];
}
-(NSString*)getCardListXML {
KeychainItemWrapper* wrapper =
[[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil];
[wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)];
return [wrapper objectForKey:CFBridgingRelease(kSecValueData)];
}
L'avevo capito e questo era essenzialmente il problema. Grazie. – iHorse
Questo sembra essere risolto nella v1.2 di KeychainWrapper, disponibile dal codice di esempio Xcode – Olaf