【发布时间】:2013-12-19 02:28:28
【问题描述】:
有时当我从 Xcode 在设备上运行应用程序时,我会尝试访问钥匙串,但由于错误 -34018 而失败。这与任何记录在案的钥匙串错误代码都不匹配,并且无法始终如一地复制。 (可能有 30% 的时间发生,我不清楚它为什么会发生)。使调试这个问题变得非常困难的原因是完全缺乏文档。知道是什么原因造成的以及如何解决吗?我正在使用 Xcode 5 并在设备上运行 iOS 7.0.4。
这里有一个未解决的问题:https://github.com/soffes/sskeychain/issues/52
编辑:为每个请求添加钥匙串访问代码
我正在使用SSKeychain 库与钥匙串进行交互。这是sn-p。
#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
大部分时间都很好。有时我会遇到无法写入或读取钥匙串的断言失败,从而导致严重的断言失败。
【问题讨论】:
-
我有同样的问题,无法重现...我正在使用 Apple 的 KeychainItemWrapper 类。有时它会从 Google Analytics 崩溃并显示相同的错误消息。我正在使用 Google Analytics v3.02。
-
另外,在 AppStore 的应用程序中似乎还可以。它只发生在开发版应用程序中。
-
我有应用商店版本的崩溃分析,不幸的是,它似乎也发生在应用商店中,尽管频率低于开发:/
-
我正在考虑放弃钥匙串,因为存储在钥匙串中的数据可能会像这样随机丢失,这对应用程序来说几乎是一个致命错误。
-
我们也看到了这个间歇性问题。当我们从 secItemCopyMatching 获得意外的 rc(包括 -34018 情况)时,我们会引发异常。我们尝试(不情愿地)添加一种机制,一旦我们从钥匙串中获得所需的值,我们将其缓存在应用程序内存中,然后从那里提供它而无需钥匙串访问。但是现在我们看到很少有这样的情况,首先获得它的一个钥匙串访问会失败,并显示 -34018。有没有人尝试在 -34018 之后重试操作?
标签: ios cocoa keychain sskeychain