Wenn ich eine Anwendung auf einem Gerät über Xcode ausführe, versuche ich manchmal, auf den Schlüsselbund zuzugreifen, was jedoch aufgrund des Fehlers -34018 fehlschlägt. Dies stimmt mit keinem der dokumentierten Schlüsselbund-Fehlercodes überein und kann nicht konsistent reproduziert werden. (passiert vielleicht 30% der Zeit und mir ist nicht klar, warum es passiert). Was das Debuggen dieses Problems sehr schwierig macht, ist der völlige Mangel an Dokumentation. Irgendeine Idee, was dies verursacht und wie man es behebt? Ich verwende Xcode 5 und verwende iOS 7.0.4 auf dem Gerät.
Hier gibt es ein offenes Problem: https://github.com/soffes/sskeychain/issues/52
BEARBEITEN: Hinzufügen eines Schlüsselbund-Zugangscodes pro Anfrage
Ich benutze die SSKeychain
Bibliothek für die Schnittstelle mit Schlüsselbund. Hier ist der Ausschnitt.
#define SERVICE @"default"
@implementation SSKeychain (EXT)
+ (void)setValue:(NSString *)value forKey:(NSString *)key {
NSError *error = nil;
BOOL success = NO;
if (value) {
success = [self setPassword:value forService:SERVICE account:key error:&error];
} else {
success = [self deletePasswordForService:SERVICE account:key error:&error];
}
NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
if (!success) {
LogError(@"Unable to set value to keychain %@", error);
}
LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
if (value == nil)
LogWarn(@"Setting keychain %@ to nil!!!", key);
}
+ (NSString *)valueForKey:(NSString *)key {
NSError *error = nil;
NSString *value = [self passwordForService:SERVICE account:key error:&error];
if (error && error.code != errSecItemNotFound) {
NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
}
return value;
}
+ (BOOL)removeAllValues {
LogInfo(@"Completely Reseting Keychain");
return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
}];
}
@end
Die meiste Zeit ist es in Ordnung. Manchmal stoße ich auf Assertionsfehler, bei denen ich weder in den Schlüsselbund schreiben noch aus diesem lesen kann, was zu einem kritischen Assertionsfehler führt.