SecItemAdd и SecItemCopyMatching возвращают код ошибки -34018 (errSecMissingEntitlement)

Иногда, когда я запускаю приложение на устройстве из XCode, я пытаюсь получить доступ к цепочке для ключей, но не удается из-за ошибки -34018. Это не соответствует ни одному из документированных кодов ошибок цепочки для ключей и не может быть последовательно воспроизведено. (случается, может быть, в 30% случаев, и мне не понятно, почему это происходит). Что делает отладку этой проблемы очень сложной, так это полное отсутствие документации. Любая идея, что вызывает это и как это исправить? Я использую Xcode 5 и работаю с iOS 7.0.4 на устройстве.

Здесь есть открытый вопрос об этом:https://github.com/soffes/sskeychain/issues/52

РЕДАКТИРОВАТЬ: Добавление кода доступа брелок для каждого запроса

Я используюSSKeychain библиотека для взаимодействия с цепочкой для ключей. Вот фрагмент.

#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

Подавляющее большинство времени это просто прекрасно. Иногда я сталкиваюсь с ошибками утверждения, когда не могу ни написать, ни прочитать из цепочки для ключей, что вызывает критическую ошибку подтверждения.

Ответы на вопрос(19)

Ваш ответ на вопрос