SecItemAdd und SecItemCopyMatching geben den Fehlercode -34018 zurück (errSecMissingEntitlement)

Wenn ich eine Anwendung auf einem Gerät über Xcode ausführe, versuche ich manchmal, auf den Schlüsselbund zuzugreifen, scheitere jedoch aufgrund des Fehlers -34018. Dies entspricht keinem der dokumentierten Schlüsselbund-Fehlercodes und kann nicht konsistent reproduziert werden. (passiert vielleicht 30% der Zeit, und es ist mir 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 es behoben werden kann? Ich verwende Xcode 5 und starte iOS 7.0.4 auf dem Gerät.

Hier gibt es eine offene Frage:https://github.com/soffes/sskeychain/issues/52

BEARBEITEN: Hinzufügen eines Schlüsselbund-Zugangscodes pro Anfrage

Ich benutze dieSSKeychain Bibliothek für die Anbindung an den 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 trete ich bei Assertionsfehlern auf, wenn ich nicht in den Schlüsselbund schreiben oder von diesem lesen kann, was zu einem kritischen Assertionsfehler führt.

Antworten auf die Frage(19)

Ihre Antwort auf die Frage