有时,当我从Xcode在设备上运行应用程序时,我会尝试访问钥匙串(keychain),但由于错误-34018而失败。这与任何已记录的钥匙串(keychain)错误代码都不匹配,并且无法一致地复制。 (可能是30%的时间,但我不清楚为什么会发生)。使调试此问题变得非常困难的原因是完全缺少文档。知道是什么原因造成的,以及如何解决?我正在使用Xcode 5并在设备上运行iOS 7.0.4。

此处有一个 Unresolved 问题:https://github.com/soffes/sskeychain/issues/52

编辑:按请求添加钥匙串(keychain)访问代码

我正在使用SSKeychain库与钥匙串(keychain)接口(interface)。这是代码段。

#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

大多数时候情况都很好。有时,我会遇到断言失败的地方,因为我无法对钥匙串(keychain)进行写入或读取,从而导致严重的断言失败。

最佳答案



来自苹果公司的答案:



https://forums.developer.apple.com/thread/4743#14441

更新



https://forums.developer.apple.com/thread/4743#126088

09-11 19:15
查看更多